静态断言,源代码不会在C 中发生变化
Static assert that source code does not change in C++
说我有一种不得更改的方法。如果这种方法更改,则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
是该函数必须保留的已知参考校验和。请注意,我对伪代码进行了很多或自由,但我希望我能传达自己想做的事情。
说我有一种不能改变的方法。如果这种方法更改,则C 中有没有办法创建编译时间错误(如果不可能编译时间,则运行时)?
否,没有办法(尤其是当您关心行为而不是源代码时)。请记住,两个函数的行为平等是一个不可避免的问题(相当于停止问题)。换句话说,lambda术语的等效性(即两个C 程序或子程序或功能)是不可否认的。
和您的要求("不应更改"的函数或方法)是不确定的。如果C 源文件刚刚重新指出怎么办?还是某些评论中的错别字已得到纠正?还是某些局部变量的名称已更改?还是出于可读性原因,for
环路被一些等效的while
替换?或一些线性扫描被更有效的二分法方法所取代;等....!
也许您可以将该函数放在其自己的源文件中,计算其中的一些加密哈希,然后将其放在您的构建过程中(例如,您的Makefile
用于Make)。
您可以花几个月的时间来进行更精美的方法(例如,自定义GCC编译器,也许在GCC融化或某些GCC插件中进行了一些扩展,以计算您的g++
编译器内部的功能中的gimple ast,应该留下同样的等等...)。我不确定是否值得付出努力。
您可能有一些时间戳机械。
在我的许多Makefile
-S中,我生成了一个__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 'nrf"' ;
echo '";') >> __timestamp.tmp
@(echo -n 'const char bismon_lastgittag[]="';
(git describe --abbrev=0 --all || echo '*notag*')
| tr -d 'nrf"'; echo '";') >> __timestamp.tmp
@(echo -n 'const char bismon_checksum[]="'; cat bismon.h
$(BM_HEADERS) $(CSOURCES) | $(MD5SUM)
| cut -d' ' -f1 | tr -d 'nrf"' ; 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
;您也可以配置构建自动化工具。
我有一种不得更改的方法。
请注意,这是A social 要求(与代码评论有关),而不是软件。代码确实会更改(您希望通过重构来避免技术债务)。您的团队应明智地使用一些良好的版本控制软件(例如GIT),您必须以某种方式相信您的同事(恶意胜任的开发人员总是可以做坏事)。
(看起来像XY问题;也许您正在寻求纯技术解决方案)
我的特殊用例是维护向后兼容性,在某些旧方法(例如持续数据避免序列化)的情况下,不得更改。
通常的方法是在使用格式的持久数据a 版本(或签名)中记录。为了了解精灵或简单的XML版本声明(xmldecl)。
(有关动态软件更新的论文可能会让您感兴趣)
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 如何避免LED在循环状态变化中闪烁?
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 当 I2C 值在C++中发生变化时收到通知
- C++ 使用增强正则表达式库时断言崩溃
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- 当我调用对象的方法时,对象的成员会发生变化
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- 为什么向量内部的指针在从函数返回时会发生变化?
- 如何将向量断言到特征矩阵
- OpenCV - Python 断言错误:SAD 算法 - 立体相机视差图计算
- 使用 Google Test 对自定义断言函数进行单元测试
- 断言"id < 0"在Qt ActiveX中失败
- 初始值设定项列表构造和静态断言
- 如何在 c++ 中循环中使用频率变化的声音?
- 在 CppUnit 中测试中止断言失败
- 静态断言,源代码不会在C 中发生变化