我正在编译我的程序,clang++ -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -g -O0
当我运行它时,输出是:
matiu@matiu-laptop:~/projects/json++11/build$ ./tests
.......==10534== WARNING: MemorySanitizer: use-of-uninitialized-value
#0 0x7fe7602d4a51 (/home/matiu/projects/json++11/build/tests+0x106a51)
#1 0x7fe7602dfca6 (/home/matiu/projects/json++11/build/tests+0x111ca6)
...
#31 0x7fe75edbaec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4)
#32 0x7fe7602808dc (/home/matiu/projects/json++11/build/tests+0xb28dc)
Uninitialized value was created by a heap allocation
#0 0x7fe76026e7b3 (/home/matiu/projects/json++11/build/tests+0xa07b3)
#1 0x7fe7602ee7da (/home/matiu/projects/json++11/build/tests+0x1207da)
...
#18 0x7fe7602c1c4c (/home/matiu/projects/json++11/build/tests+0xf3c4c)
#19 0x7fe7602873fa (/home/matiu/projects/json++11/build/tests+0xb93fa)
SUMMARY: MemorySanitizer: use-of-uninitialized-value ??:0 ??
Exiting
Run Code Online (Sandbox Code Playgroud)
如何让它显示像美丽的例子中的行号:http://clang.llvm.org/docs/MemorySanitizer.html
我怀疑它可能是不可能的,因为我的pragram是一群巨大的嵌套lambda:https://github.com/matiu2/json--11/blob/master/tests.cpp
所以我正在用两个静态库构建一个共享库.
这个答案说这样做的方法是-Wl,--whole-archive
在我的静态库之前插入,然后插入-Wl,--no-whole-archive
它们.
那么我目前在cmake中为共享库提供的是:
add_library(wittyPlus SHARED empty.cpp)
target_link_libraries(wittyPlus
${wtdbosqlite}
${WT_LIBRARIES}
${DB_LIBRARIES}
${Boost_LIBRARIES}
app models
)
Run Code Online (Sandbox Code Playgroud)
所以,我需要的是为它加上-Wl,--whole-archive
之前app
和models
,然后-Wl,--no-whole-archive
在他们之后(以标准库进口不要被共享库导出).
在CMake中最简单的方法是什么?
另外:所以我想尽可能多地使用标准的cmake东西,这样我就不需要为Windows构建做任何额外的工作,因为CMake会删除平台上不支持的编译器定义.建成.
我正在做一些递归解析.
目前我有一个假堆栈,我在那里为我的有限状态机存储状态,所以当我递归地向下钻取时我按下我所处的状态,并在我完成处理递归的文本后稍后弹出它.
拥有'state id'堆栈会更快吗?
int* stack = 0
int top = 0;
// ...
// drill down bit
if (stack == 0)
stack = (int*)malloc(STACK_JUMP_SIZE);
else if (top % STACK_JUMP_SIZE == 0)
stack = (int*)realloc(stack, (top+STACK_JUMP_SIZE) * sizeof(int));
stack[top++] = currentState;
// ...
// pop up later
{currentState = stack[--top]; {
if (top == 0) {
free(stack);
stack = 0;
} else if ((top+1) % STACK_JUMP_SIZE == 0) {
stack = (int*)realloc(stack, (top+1)*sizeof(int));
}
Run Code Online (Sandbox Code Playgroud)
或者将事物拆分成适当的函数并让C++担心堆栈会更快.
(我知道有人会告诉我'那是C,它不是c ++',所以我先发制人地回答,我的程序是c ++但其中有很多c).
我有一个写入原子变量的线程.(使用memory_order_release).线程A.
还有许多其他线程可以从该变量中读取.(使用memory_order_acquire).线程B.
在线程A中,使用memory_order_relaxed读取该变量是否安全?