我用如下clang编译以下代码:
clang main.cpp -Werror -Wconditional-uninitialized
代码:
#include <stdio.h>
bool captureSupported() {
return true; // it makes no difference to the compiler if it returns true or false
}
// false - success, true - failure
bool capture(char **ptr) {
// it makes no difference to the compiler if it is commented out or not
// *ptr = (char*)"captured";
return true; // it makes no difference to the compiler if it returns true or false
}
void foo() {
char *ptr;
bool capture_raw = true;
if(captureSupported() && (!capture(&ptr)) ) { // compilation warning/error
// if(true && (!capture(&ptr)) ) { // no warning/error
// if(false && (!capture(&ptr)) ) { // no warning/error
// if(captureSupported() && (!false) ) { // no warning/error
// if(captureSupported() && (!true) ) { // no warning/error
capture_raw = false;
} else {
printf("cannot capture\n");
}
if(capture_raw) {
ptr = (char*)"raw captured";
}
printf("%s", ptr);
}
int main() {
foo();
return 0;
}
任何人都可以向我解释为什么编译结果是
main.cpp:33:16: error: variable 'ptr' may be uninitialized when used here [-Werror,-Wconditional-uninitialized]
printf("%s", ptr);
^~~
main.cpp:16:12: note: initialize the variable 'ptr' to silence this warning
char *ptr;
^
= nullptr
1 error generated.
没有可能未初始化ptr的路径。还是如果编译器非常聪明,以至于无法确定capture()对其进行了初始化,那么为什么要注释掉“ ifs”,使编译器感到高兴呢?
答案 0 :(得分:1)
您正在以错误的方式阅读警告。
此处使用变量'ptr'可能未初始化
这意味着编译器不能证明变量在使用前已初始化,而不是它可以证明其未被初始化。
答案 1 :(得分:0)
我只是按照编译器的建议进行操作并初始化变量。 那将使警告消失。这是最佳做法,可以创建更安全的代码。