标签: gcc-warning

转换为void不会删除warn_unused_result错误

在测试中,我丢弃了任何东西,stderr因为它使测试用例的输出变得混乱.我正在使用以下代码:

freopen("/dev/null", "w", stderr);
Run Code Online (Sandbox Code Playgroud)

编译时-Wall -Werror,我得到错误

error: ignoring return value of ‘freopen’, declared with attribute warn_unused_result
Run Code Online (Sandbox Code Playgroud)

这是预料之中的.但是,通常的铸造解决方案void似乎不起作用.也就是说,将代码更改为

(void) freopen("/dev/null", "w", stderr);
Run Code Online (Sandbox Code Playgroud)

仍然会产生相同的警告.我不在乎这个函数是否失败,因为最坏的情况是一些额外的输出.我可以解决这个问题吗?

编辑:我知道我可以引入一个额外的不必要的变量.我真的很想知道为什么无法转换为无效.

更新: 我决定采用这个:

FILE *null = fopen("/dev/null", "w");
if (null) { fclose(stderr); stderr = null; }
Run Code Online (Sandbox Code Playgroud)

freopen仔细阅读文档之后,我看到如果打开/dev/null失败,stderr仍然会被销毁.这解决了这个问题.

c gcc gcc-warning

12
推荐指数
2
解决办法
5430
查看次数

如何让gcc警告返回局部变量的地址?

gcc4.4.5中,我发出以下代码的警告.

char *f(void)
{
    char c;
    return &c;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我使用临时指针时,不再有警告(即使行为是错误的).

char *f(void)
{
    char c;
    char *p = &c;
    return p;
}
Run Code Online (Sandbox Code Playgroud)

我听说在C中指针分析很困难,但可以gcc警告这样的代码吗?

c gcc gcc-warning

12
推荐指数
1
解决办法
3478
查看次数

为什么std :: abs返回签名类型

当我比较一个std::abs(int)和一个时,我正在收到有关签名与无签名比较的警告unsigned.事实上,std::abs返回签署的值.为什么选择这个?它将解决负值的问题,其绝对值不能用有符号的类型表示.

然后,是否有比这更清洁(即没有演员表)的东西以避免警告?

#include <cassert>
#include <cstdlib>

// max(1, lhs + rhs). (lhs must be > 0)
unsigned add(unsigned lhs, int rhs)
{
  return
    (0 < rhs || static_cast<unsigned>(-rhs) < lhs
     ? rhs + lhs
     : 1);
}

int main()
{
  assert(add(42, -41) == 1);
  assert(add(42, 0) == 43);
  assert(add(42, 1) == 43);
  assert(add(42, -51) == 1);
}
Run Code Online (Sandbox Code Playgroud)

c++ unsigned signed gcc-warning

12
推荐指数
1
解决办法
1501
查看次数

-fPIC被目标忽略(所有代码都与位置无关),无用的警告

当我编译我的库时,我已经开启了,-fPIC因为我希望能够将其编译为共享库,但也可以作为静态编译.

在cygwin上使用gcc 3.4.4我在所有源文件上收到此警告:

-fPIC ignored for target (all code is position independent)
Run Code Online (Sandbox Code Playgroud)

而且我真的很想知道它有什么意义.它告诉我,我使用的开关没有效果,因为开关应该已经完成​​了.嗯,这意味着它是多余的,很好.但它有什么意义呢?我该如何压制它呢?

我不是在谈论为什么使用PIC,而是为什么它会产生IMO无用的警告.

c c++ gcc-warning

12
推荐指数
1
解决办法
5148
查看次数

隐式转换的gcc警告标志

我最近在下一个类似的上下文中遇到了一个错误:

double getSomeValue()
{
    return 4.0;
}
...
std::string str;
str = getSomeValue();
Run Code Online (Sandbox Code Playgroud)

正如您在这里看到的那样很容易发现问题,但是在一个大型代码库中getSomeValue(),调用代码不在同一个文件中,可能很难发现这doublestd::string静默转换.GCC编译这段代码很好-Wall -Wextra -Werror(这里的示例输出,我不知道使用了什么警告标志:http://ideone.com/BTXBFk).

我如何强制GCC为这些危险的隐式转换发出警告?我试过了-Wconversion,但它非常严格,它会导致大多数包含标题的错误,例如unsigned - 1.是否有较弱的版本-Wconversion

c++ gcc type-conversion gcc-warning

12
推荐指数
1
解决办法
1512
查看次数

返回的通用lambda的参数据称是自由函数的阴影参数

编译以下代码

template <typename X, typename F>
auto apply(X x, F f)
{
    return f(x);
}

template <typename Y>
auto add_value(Y y)
{
    return [y](auto x)
    {
        return x + y;
    };
}

int main()
{
    apply(1, add_value(2));
}
Run Code Online (Sandbox Code Playgroud)

用g ++(egv 5.4)给出阴影警告.

$ g++ -Wshadow -Werror -std=c++14 shadow_test.cpp 
shadow_test.cpp: In instantiation of ‘add_value(Y)::<lambda(auto:1)> [with auto:1 = int; Y = int]’:
shadow_test.cpp:4:13:   required from ‘auto apply(X, F) [with X = int; F = add_value(Y) [with Y = int]::<lambda(auto:1)>]’
shadow_test.cpp:18:26:   required …
Run Code Online (Sandbox Code Playgroud)

c++ gcc g++ gcc-warning c++14

12
推荐指数
1
解决办法
343
查看次数

GCC编译器是否应该为这个涉及[[fallthrough]]属性的不正确的C++代码进行诊断?

我正在GCC编译器版本7.1.0上测试C++ 17的功能.这与fallthrough属性有关,以下示例(实例)在此处改编自在线CPP参考

#include "iostream"
using namespace std;

int f(int n) {

  switch (n) {
    case 1:
    case 2:
      n = n + 20;
     [[fallthrough]];
    case 3: // no warning on fallthrough      
      n = n + 30;
    case 4: // compiler may warn on fallthrough      
      [[fallthrough]]; // ill­formed, not before a case label
      //n = n + 40;  //commented out to test if compiler will warn.
  }
  return n;
}    

int main()
{
    cout << …
Run Code Online (Sandbox Code Playgroud)

c++ gcc gcc-warning fall-through c++17

12
推荐指数
1
解决办法
450
查看次数

GCC警告:ISO C不允许使用命名的可变参数宏

使用以下命令

gcc -c -Wall -Wextra -pedantic -ansi -std=c99 -fstack-protector-all -fstack-check -O3 root.c -o  rootTESTOBJECT
Run Code Online (Sandbox Code Playgroud)

我得到编译器警告root.h:76:22:警告:ISO C不允许命名的可变参数宏

72 #ifdef Debug
73 #include <stdio.h>
74 #define crumb(phrase0...) printf(phrase0)
75 #else
76 #define crumb(phrase0...) 
77 #endif
Run Code Online (Sandbox Code Playgroud)

我相信选项-ansi -std = c99允许使用可变参数宏,无论如何它根据文档...

我已经尝试编辑76行了

76 #define crumb(phrase0...) printf("")
Run Code Online (Sandbox Code Playgroud)

看看这是否修复了警告,但没有任何乐趣.

编译器版本是Apple的gcc,版本4.2.1我不确定我是否需要过于担心,但我真的不喜欢警告.我错过了什么旗帜?

gcc gcc-warning

11
推荐指数
1
解决办法
8663
查看次数

为什么-Wcast-align没有警告在x86上从char*转换为int*?

我知道gcc有一个选项-Wcast-align,只要指针被转换就会发出警告,以便增加目标所需的对齐.

这是我的计划:

char data[10];
int ptr = *((int *)data);
Run Code Online (Sandbox Code Playgroud)

在我的机器上,数据的对齐要求是1,而ptr是8.

为什么我没有收到警告?

可能是因为我正在为x86编译吗?

c memory-alignment gcc-warning typecasting-operator

11
推荐指数
1
解决办法
6922
查看次数

错误:此语句可能会失败 [-Werror=implicit-fallthrough=]

我正在尝试在 ubuntu 上编译 mitk,但出现此错误:

错误:此语句可能会失败 [-Werror=implicit-fallthrough=]

这里有一部分代码:

      /** Get memory offset for a given image index */
      unsigned int GetOffset(const IndexType & idx) const
      {
       const unsigned int * imageDims = m_ImageDataItem->m_Dimensions;

        unsigned int offset = 0;
        switch(VDimension)
        {
        case 4:
         offset = offset + idx[3]*imageDims[0]*imageDims[1]*imageDims[2];
        case 3:
        offset = offset + idx[2]*imageDims[0]*imageDims[1];
        case 2:
        offset  = offset + idx[0] + idx[1]*imageDims[0];
         break;
        }

        return offset;
      }
Run Code Online (Sandbox Code Playgroud)

请提供任何帮助,我将不胜感激。

c++ gcc build gcc-warning mitk

11
推荐指数
2
解决办法
2万
查看次数