кросс-платформенный — Статические утверждают, что исходный код не изменяется в Stack Overflow

Скажем, у меня есть метод, который не должен меняться. Есть ли способ в C ++ создать ошибку времени компиляции (или время выполнения, если время компиляции невозможно), если такой метод изменяется?

Существует много вариантов использования такого метода (рассмотрите возможность создания нестабильных потоков или проблем безопасности, которые не нужно менять начинающему коллеге). Мой конкретный пример использования заключается в поддержании обратной совместимости, когда некоторые старые методы, такие как десериализаторы постоянных данных, не должны изменяться.

Я представляю что-то вроде следующего:

static_assert(chechsumOfBelowFunction() != 0x123,
"You changed the method! We can't do this because...")
std::string getRelaseDateForVersion3()
{
// This should never change because "Version 3" was
// only released once!
return "2014-Jan-01";
}

куда checksumOfBelowFunction() вычисляет контрольную сумму или другое уникальное представление функции (предпочтительно кросс-платформенное) во время компиляции и 0x123 является известной контрольной контрольной суммой того, чем должна оставаться функция. Обратите внимание на то, что я немного потрудился с псевдокодом, но я надеюсь передать то, что я пытаюсь сделать.

1

Решение

Скажем, у меня есть метод, который не должен меняться. Есть ли способ в C ++ создать ошибку времени компиляции (или время выполнения, если время компиляции невозможно), если такой метод изменяется?

нет, нет способа (особенно если вы заботитесь о поведении, а не об исходном коде). Помните, что равенство поведения двух функций является неразрешимой проблемой (эквивалентной Проблема остановки). Другими словами, эквивалентность лямбда-терминов (то есть из двух программ C ++, подпрограмм или функций) неразрешимый.

И ваш требование (функции или метода, которые «не должны меняться») неточно указанный. Что делать, если исходный файл C ++ просто перезаписан? Или опечатка в каком-то комментарии исправлена? Или имя какой-то локальной переменной просто изменилось? Или для удобства чтения for цикл заменен некоторым эквивалентным while? Или некоторое линейное сканирование, замененное более эффективным дихотомическим подходом; так далее….!

Возможно, вы могли бы поместить эту функцию в ее собственный исходный файл, вычислить ее криптографический хэш и поместить ее в процесс сборки (например, ваш Makefile за делать).

Вы могли бы потратить месяцы работы на более причудливые подходы (например, настроить свой компилятор GCC, возможно, с некоторым расширением в GCC MELT или какой-то GCC плагин, вычислить внутри вашего g++ компилятор хеш GIMPLE АСТ вашей функции, которая должна оставаться такой же, и т. Д …). Я не уверен, что оно того стоит.


Вы могли бы иметь некоторые временные метки.

Во многих из моих Makefile-с я генерирую __timestamp.c файл, например лайк:

__timestamp.c: Makefile
@(date +'const char bismon_timestamp[]="%c";'; \
date +'%n const unsigned long bismon_timelong=%sL;' > __timestamp.tmp)
@(echo -n 'const char bismon_lastgitcommit[]="' ; \
git log --format=oneline --abbrev=12 --abbrev-commit -q  \
| head -1 | tr -d '\n\r\f\"\\\\' ; \
echo '";') >> __timestamp.tmp
@(echo -n 'const char bismon_lastgittag[]="'; \
(git describe --abbrev=0 --all || echo '*notag*') \
| tr -d '\n\r\f\"\\\\'; echo '";') >> __timestamp.tmp
@(echo -n 'const char bismon_checksum[]="'; cat bismon.h \
$(BM_HEADERS) $(CSOURCES) | $(MD5SUM) \
| cut -d' ' -f1 | tr -d '\n\r\f\"\\' ; echo '";') >> __timestamp.tmp
@(echo -n 'const char bismon_directory[]="'; \
/bin/pwd | tr -d '\n\\"' ; echo '";') >> __timestamp.tmp
@(echo -n 'const char bismon_makefile[]="'; \
echo -n  $(realpath $(lastword $(MAKEFILE_LIST))); \
echo '";') >> __timestamp.tmp
@mv __timestamp.tmp __timestamp.c

а потом я ссылку __timestamp.o в исполняемом файле; вы можете настроить свой автоматизация сборки инструмент также.


У меня есть метод, который не должен меняться.

Обратите внимание, что это Социальное требование (связанное с обзорами кода), а не программное. Код меняется (вы хотите избежать технический долг от рефакторинг кода). Ваша команда должна мудро использовать некоторые хорошие программное обеспечение для контроля версий (например. мерзавец) и вы должны как-то доверять своим коллегам (компетентный разработчик-злоумышленник всегда может совершать плохие поступки).

(похоже, что некоторые XY проблема; возможно, вы ищете чисто техническое решение социальной проблемы)

Мой конкретный пример использования заключается в поддержании обратной совместимости, когда некоторые старые методы, такие как десериализаторы постоянных данных, не должны изменяться.

Обычным способом является запись в постоянных данных версия (или подпись) используемого формата. Для вдохновения загляните в ELF или просто XML объявление версии (XMLDecl).

(документы по динамическое обновление программного обеспечения может вас заинтересовать)

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector