小编onq*_*tam的帖子

进程的退出代码是否可以为小值溢出?

我正在编写测试框架,在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问题所以我现在小心了

c++ bash terminal cmd exit-code

6
推荐指数
1
解决办法
123
查看次数

使用地址清理程序时的g ++ 5和6的错误以及静态初始化顺序的附加asan标志

我的库doctesttravis CI上进行了200多次构建测试- x86/x64 Debug/Release linux/osx以及各种编译器 - 从gcc 4.4到6以及clang 3.4到3.8

我的所有测试都是通过valgrind和地址消毒剂(也是UB消毒剂)进行的.

我最近发现并非所有ASAN功能都默认开启 - 例如:

  • check_initialization_order=true
  • detect_stack_use_after_return=true
  • strict_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)

c++ g++ clang address-sanitizer

6
推荐指数
1
解决办法
851
查看次数

试图区分不同种类的右值 - 文字和非文字

我想要一个只能用左值调用的方法,所以我做了以下事情:

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))

c++ rvalue rvalue-reference move-semantics c++11

6
推荐指数
1
解决办法
237
查看次数

是否存在平面未排序的地图/集实现?

boost.container flat_map和其他人一样,Loki AssocVector和许多其他人都喜欢这些元素.

是否有现代(c ++ 11移动启用等)实现的未分类矢量适合作为地图/集?

我的想法是将它用于非常小的地图/集(少于20个元素)和简单的密钥(对于这些密钥,散列并不总是有意义)

c++ containers boost stl c++11

5
推荐指数
1
解决办法
2625
查看次数

试图沉默-Waggregate-只返回一个宏的g ++ - buggy编译器?

使用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)

这个行为应该不一样吗?

我不认为ResultExpressionDecomposer类型很重要 - 只是课程.

我正试图让表达式分解像这里一样工作(事情已经重新命名了一下).

编辑: >> here <<是使用lest库的问题的现场演示

我的问题是:为什么?如何使用宏在第一种情况下自由警告?我无法承受全球范围内的警告.

c++ g++ compiler-warnings suppress-warnings compiler-bug

5
推荐指数
1
解决办法
167
查看次数

如何获取函数中当前包含的cmake文件的路径?

假设我有这个:

#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_DIRCMAKE_CURRENT_SOURCE_DIR.

那么是否有一个 cmake 变量可以让我得到我想要的东西?

或者有没有办法获得完整的路径,file.cmake这样我至少可以通过这种方式获得它的路径?

cmake

5
推荐指数
1
解决办法
1223
查看次数

asan与g ++ 5.4.0不兼容travis CI

直到最近,使用地址消毒剂在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配置文件中添加- 请参阅此处

c++ g++ sanitizer travis-ci address-sanitizer

5
推荐指数
1
解决办法
445
查看次数

__cxa_atexit()和atexit()之间有什么区别

GCC文档中,我找到了该-fuse-cxa-atexit选项,并说明了以下内容:

完全符合标准的静态析构函数处理需要此选项

那两者有什么区别?在__cxa_atexit我的文档中我发现了以下内容:

__cxa_atexit()函数用于实现atexit()

我正在函数中实现静态(不要问为什么),我想知道用于调用析构函数的2中的哪一个.

我想我只有atexit()MSVC?那是问题吗?

我可以atexit()在任何地方使用并确保它的行为就像函数中的真实静态对象一样吗?

c++ atexit

5
推荐指数
1
解决办法
4171
查看次数

从boost :: variant获取索引项,就像使用std :: variant一样

随着std::variant<int, bool>我可以调用std::get<0>(var)的变种来获取值,因为它是第一种类型- int.

我怎么能这样做boost::variantboost::get<>似乎只支持按类型而不是索引获取,我发现文档很难理解.

c++ boost variant boost-variant

5
推荐指数
1
解决办法
910
查看次数

只有间接泄漏,没有直接泄漏

阅读完这个 StackOverflow 问题后:直接泄漏和间接泄漏有什么区别?我留下的印象是,如果我修复所有直接泄漏(多次修复测试通过,因为在修复之前的直接泄漏后间接泄漏可能会变成直接泄漏),最终我会得到 0 次泄漏。

我目前正在使用 Leak Sanitizer (LSAN),在修复了所有直接泄漏(因此一些间接泄漏消失了)之后,我现在留下了一堆间接泄漏。为什么没有直接的?这什么时候会发生?如何诊断和修复剩余的泄漏?

valgrind memory-leaks memory-leak-detector leak-sanitizer

5
推荐指数
1
解决办法
638
查看次数