lang编译器说:变量“ ptr”可能未初始化

时间:2020-02-21 11:04:25

标签: c++ clang++

我用如下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”,使编译器感到高兴呢?

2 个答案:

答案 0 :(得分:1)

您正在以错误的方式阅读警告。

此处使用变量'ptr'可能未初始化

这意味着编译器不能证明变量在使用前已初始化,而不是它可以证明其被初始化。

答案 1 :(得分:0)

我只是按照编译器的建议进行操作并初始化变量。 将使警告消失。这是最佳做法,可以创建更安全的代码。