我正在编写测试框架,在main()中我返回失败测试的数量.例如:
int main() {
int failedTests = runTests();
return failedTests;
}
Run Code Online (Sandbox Code Playgroud)
这个"int"溢出了吗?我能%ERROR_LEVEL%要== 0当我真正回来的东西比0有什么不同?它取决于主机操作系统吗?通常的最大值是多少?我可以确定整数<32768(2 ^ 16 - 一个短)总是适合吗?
编辑:
我有sys.exit使用0-127范围(几乎)的python问题所以我现在小心了
我的库doctest在travis CI上进行了200多次构建测试- x86/x64 Debug/Release linux/osx以及各种编译器 - 从gcc 4.4到6以及clang 3.4到3.8
我的所有测试都是通过valgrind和地址消毒剂(也是UB消毒剂)进行的.
我最近发现并非所有ASAN功能都默认开启 - 例如:
check_initialization_order=truedetect_stack_use_after_return=truestrict_init_order=true所以我启用了它们并开始获取代码错误,如下例所示.
int& getStatic() {
static int data;
return data;
}
int reg() { return getStatic() = 0; }
static int dummy = reg();
int main() { return getStatic(); }
Run Code Online (Sandbox Code Playgroud)
编译g++ (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010:
g++ -fsanitize=address -g -fno-omit-frame-pointer -O2 a.cpp
并像这样跑:
ASAN_OPTIONS=verbosity=0:strict_string_checks=true:detect_odr_violation=2:check_initialization_order=true:detect_stack_use_after_return=true:strict_init_order=true ./a.out
产生以下错误:
==23425==AddressSanitizer CHECK failed: ../../../../src/libsanitizer/asan/asan_globals.cc:255 "((dynamic_init_globals)) != (0)" (0x0, 0x0)
#0 0x7f699bd699c1 (/usr/lib/x86_64-linux-gnu/libasan.so.2+0xa09c1)
#1 0x7f699bd6e973 …Run Code Online (Sandbox Code Playgroud) 我想要一个只能用左值调用的方法,所以我做了以下事情:
template <typename T>
MyClass& cache(T&) {}
template <typename T>
MyClass& cache(const T&&) = delete;
Run Code Online (Sandbox Code Playgroud)
这工作正常 - 我甚至可以传递C字符串文字,因为它们也是左值.
我需要左值的原因是因为我正在缓存指向传递对象的指针 - 这意味着它们不能成为临时对象.
以下代码有效:
MyClass a;
a.cache("string literal");
int temp = 6;
a.cache(temp);
Run Code Online (Sandbox Code Playgroud)
以下代码(根据需要)不起作用:
int getInt(); // fwd decl
a.cache(getInt());
Run Code Online (Sandbox Code Playgroud)
但我也希望能够传递其他文字 - 但它们似乎都是rvalues ......
以下代码不起作用(但我希望它可以):
MyClass a;
a.cache(6);
Run Code Online (Sandbox Code Playgroud)
有没有办法区分这样的文字和非文字价值?
有没有办法轻松将这些文字变成左值?我发现Stack Overflow上的这个答案提到了类似的东西,unless you write 1L但即使我给L一个文字后缀,它仍然是一个临时的.
即使是宏也可以 - 就像这样:( a.cache(TURN_TO_LVALUE(6));或CONSTANTIZE(6))
有boost.container flat_map和其他人一样,Loki AssocVector和许多其他人都喜欢这些元素.
是否有现代(c ++ 11移动启用等)实现的未分类矢量适合作为地图/集?
我的想法是将它用于非常小的地图/集(少于20个元素)和简单的密钥(对于这些密钥,散列并不总是有意义)
使用g ++和编译 -Waggregate-return
#define DOCTEST_CHECK(expr) \
do { \
_Pragma("GCC diagnostic push"); \
_Pragma("GCC diagnostic ignored \"-Waggregate-return\"");\
if(Result failed = (ExpressionDecomposer() << expr)) \
printf("%s\n", failed.m_decomposition.c_str()); \
_Pragma("GCC diagnostic pop"); \
} while(false)
DOCTEST_CHECK(true == false); // produces warnings
Run Code Online (Sandbox Code Playgroud)
但手动展开的版本不会产生任何警告:
do {
_Pragma("GCC diagnostic push");
_Pragma("GCC diagnostic ignored \"-Waggregate-return\"");
if(Result failed = (ExpressionDecomposer() << true == false))
printf("%s\n", failed.m_decomposition.c_str());
_Pragma("GCC diagnostic pop");
} while(false);
Run Code Online (Sandbox Code Playgroud)
这个行为应该不一样吗?
我不认为Result和ExpressionDecomposer类型很重要 - 只是课程.
我正试图让表达式分解像这里一样工作(事情已经重新命名了一下).
编辑: >> here <<是使用lest库的问题的现场演示
我的问题是:为什么?如何使用宏在第一种情况下自由警告?我无法承受全球范围内的警告.
假设我有这个:
#root/CMakeLists.txt
include(folder/file.cmake)
foo()
Run Code Online (Sandbox Code Playgroud)
和
#root/folder/file.cmake
function(foo)
message(${SOME_SPECIAL_CMAKE_VARIABLE})
endfunction()
Run Code Online (Sandbox Code Playgroud)
我想path/to/root/folder打印出来。我尝试了这两个,但他们没有得到我想要的:CMAKE_CURRENT_LIST_DIR或CMAKE_CURRENT_SOURCE_DIR.
那么是否有一个 cmake 变量可以让我得到我想要的东西?
或者有没有办法获得完整的路径,file.cmake这样我至少可以通过这种方式获得它的路径?
直到最近,使用地址消毒剂在travis上使用g ++ 5构建的版本正在传递 - 在过去的一周里他们破了.
我看到g ++的版本被撞到(Ubuntu 5.2.1-23ubuntu1~12.04) 5.2.1 20151031了(Ubuntu 5.4.0-3ubuntu1~12.04) 5.4.0 20160603(从${CXX} --version线上看)
错误来自链接器 - /usr/bin/ld: unrecognized option '--push-state'
最后一个工作的构建 - 在这里
当前破碎的构建 - 在这里
不知道这是否是一个已知问题?它在哪里报道?有解决方法吗?
这是我在github上的存储库 - 它使用CMake并且不添加任何链接器标志.我-fsanitize=address从.travis.yml配置文件中添加- 请参阅此处
在GCC文档中,我找到了该-fuse-cxa-atexit选项,并说明了以下内容:
完全符合标准的静态析构函数处理需要此选项
那两者有什么区别?在__cxa_atexit我的文档中我发现了以下内容:
__cxa_atexit()函数用于实现atexit()
我正在函数中实现静态(不要问为什么),我想知道用于调用析构函数的2中的哪一个.
我想我只有atexit()MSVC?那是问题吗?
我可以atexit()在任何地方使用并确保它的行为就像函数中的真实静态对象一样吗?
随着std::variant<int, bool>我可以调用std::get<0>(var)的变种来获取值,因为它是第一种类型- int.
我怎么能这样做boost::variant?boost::get<>似乎只支持按类型而不是索引获取,我发现文档很难理解.
阅读完这个 StackOverflow 问题后:直接泄漏和间接泄漏有什么区别?我留下的印象是,如果我修复所有直接泄漏(多次修复测试通过,因为在修复之前的直接泄漏后间接泄漏可能会变成直接泄漏),最终我会得到 0 次泄漏。
我目前正在使用 Leak Sanitizer (LSAN),在修复了所有直接泄漏(因此一些间接泄漏消失了)之后,我现在留下了一堆间接泄漏。为什么没有直接的?这什么时候会发生?如何诊断和修复剩余的泄漏?