标签: gcc-warning

抑制警告:使用`mktemp'很危险

如何从gcc链接器中抑制以下警告:

警告:使用'mktemp'很危险,更好用'mkstemp'

我知道它最好使用mkstemp()但由于某种原因我必须使用mktemp()功能.

c security gcc gcc-warning mktemp

8
推荐指数
1
解决办法
1万
查看次数

即使L后缀,C中的十六进制常量也是无符号的

我知道这是一个简单的问题,但我很困惑.我有一个相当典型的gcc警告,通常很容易修复:
warning: comparison between signed and unsigned integer expressions

每当我有一个带有最高有效位的十六进制常量时,如0x80000000L,编译器会将其解释为无符号.例如,使用-Wextra编译此代码将导致警告(gcc 4.4x,4.5x):

int main()
{
long test = 1;
long *p = &test;
if(*p != 0x80000000L) printf("test");
}
Run Code Online (Sandbox Code Playgroud)

我已经特别为常量加了后缀,为什么会发生这种情况呢?

c comparison gcc compile-time-constant gcc-warning

8
推荐指数
1
解决办法
4782
查看次数

constexpr返回数组,gcc警告

我写了一个返回数组的constexpr函数.

#include <iostream>

constexpr auto get_str(void)
-> const char(&)[4] {   
    return { 'T', 'E', 'S', 'T' };
}

constexpr int sum(const char(&str)[4]){
    return str[0] + str[1] + str[2] + str[3];
}

int main(void){

    constexpr int s = sum(get_str());

    std::cout << s << std::endl;

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

g ++ 4.8正确编译代码,但发出以下警告:

test.cpp: In function ‘constexpr const char (& get_str())[4]’:
test.cpp:5:30: warning: returning reference to temporary [-Wreturn-local-addr]
  return { 'T', 'E', 'S', 'T' };
Run Code Online (Sandbox Code Playgroud)

在这种情况下警告是否正确?从这样的constexpr函数返回数组是不正确的,即使该函数在运行时从未实际调用过,只是在编译期间?

c++ arrays gcc gcc-warning constexpr

8
推荐指数
1
解决办法
1155
查看次数

g ++标志的含义-Wall -W -Werror

这些是什么,他们做了什么?

-Wall -W -Werror
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu中使用终端用这个命令编译程序:

$ g++ -Wall -W -Werror main.cpp -o exec
Run Code Online (Sandbox Code Playgroud)

谁有人向我解释这个?

compiler-flags gcc-warning

8
推荐指数
1
解决办法
1万
查看次数

不一致的警告"从'const unsigned char'转换为'const float'需要缩小转换"

Visual C++ 2017和gcc 5.4 在此代码段中产生但不是conversion from 'const unsigned char' to 'const float' requires a narrowing conversion警告:Line BLine A

#include <iostream>

int main() {
    const unsigned char p = 13;
    const float         q = p;  // Line A

    std::cout << q << '\n';

    const unsigned char c[3] = {0, 1, 255};
    const float         f[3] = {c[2], c[0], c[1]};  // Line B

    for (auto x:f)
        std::cout << x << '\n';
}
Run Code Online (Sandbox Code Playgroud)

这个警告有效吗?为什么Line B治疗不同于Line A

c++ gcc gcc-warning visual-c++ c++11

8
推荐指数
1
解决办法
230
查看次数

在禁用复制的 POD 类型的 memcpy 上避免使用 `-Wclass-memaccess`

如果您将警告级别提高到-Wall,GCC 8(至少g++ (Ubuntu 8.3.0-6ubuntu1~18.10.1) 8.3.0--std=c++17)会给出-Wclass-memaccess

#ifdef __cplusplus
   #include <type_traits>
#endif
#include <string.h>

struct CantCopy {
    int i;

  #ifdef __cplusplus
    CantCopy () = default;
    CantCopy (const CantCopy &other) = delete;
    void operator= (const CantCopy &rhs) = delete;
  #endif
};

int main(int argc, char *argv[]) {

  #ifdef __cplusplus
    static_assert(std::is_pod<CantCopy>::value);
  #endif

    struct CantCopy src;
    src.i = 1020;

    struct CantCopy dest;
    memcpy(&dest, &src, sizeof(struct CantCopy));

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

警告说:

警告:'void* memcpy(void*, const void*, size_t)' 写入类型为 'struct …

c++ gcc memcpy gcc-warning

8
推荐指数
1
解决办法
2855
查看次数

返回 std::tie - 悬空引用?

关于从函数返回 std::tie 的问题。如果我理解正确,那么 std::tie 仅包含引用。因此,返回指向函数局部变量的 std::tie 是一个非常糟糕的主意。编译器不应该能够检测到这一点并发出警告吗?

实际上,我们的代码中有这个错误,而我们的所有编译器和清理程序都没有检测到它。我很困惑任何工具都没有报告这一点。或者我理解有什么不正确的吗?

#include <tuple>

struct s_t {
    int a;
};

int& foo(s_t s) {
    return s.a; // warning: reference to local variable 's' returned
}

int& bar(s_t &s) {
    return s.a; // ok
}

auto bad(s_t s) {
    return std::tie(s.a); // no warning
}

auto fine(s_t &s) {
    return std::tie(s.a); // no warning
}

int main() {

    s_t s1,s2;

    auto bad_references = bad(s1);
    auto good_references = fine(s2);
    // ...

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

c++ gcc-warning

8
推荐指数
1
解决办法
529
查看次数

C++:警告:'...'声明的可见性高于其字段'... :: <anonymous>'的类型

我收到了这两个警告(在MacOSX上使用GCC 4.2):

/Users/az/Programmierung/openlierox/build/Xcode/../../src/main.cpp:154:0 /Users/az/Programmierung/openlierox/build/Xcode/../../src/main .cpp:154:警告:'startMainLockDetector():: MainLockDetector'声明的可见性高于其字段'startMainLockDetector():: MainLockDetector :: <anonymous>'的类型

/Users/az/Programmierung/openlierox/build/Xcode/../../src/main.cpp:154:0 /Users/az/Programmierung/openlierox/build/Xcode/../../src/main .cpp:154:警告:声明'startMainLockDetector():: MainLockDetector'的可见性高于其基数'Action'

在这段代码中:

struct Action {
    virtual ~Action() {}
    virtual int handle() = 0;
};


static void startMainLockDetector() {
    /* ... */

    struct MainLockDetector : Action {
         bool wait(Uint32 time) { /* ... */ }
         int handle() { /* ... */ }
    };

    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

我不确定这些警告意味着什么(能见度?)以及如何解决它们.(我真的希望类MainLockDetector只对该函数是本地的.)

我已经与许多其他编译器(clang,GCC 3.*,GCC 4.0,GCC 4.4等)编译了相同的代码,并且从未对此代码发出任何警告.

c++ gcc warnings visibility gcc-warning

7
推荐指数
2
解决办法
5710
查看次数

为什么没有clang警告从double到int的隐式转换,但是从long到int时呢?

在以下代码中:

#include <iostream>
int main()
{
  const long l = 4294967296;
  int i = l;
  return i; //just to silence the compiler
}
Run Code Online (Sandbox Code Playgroud)

编译器警告隐式转换(使用-Wall和-std = c ++ 14)如下:

warning: implicit conversion from 'const long' to 'int' changes value from 4294967296 to 0 [-Wconstant-conversion]
Run Code Online (Sandbox Code Playgroud)

没关系.但是如果转换是从double到int,则没有警告,如下面的代码所示:

#include <iostream>
int main()
{
  const double d = 4294967296.0;
  int i = d;
  return i; //just to silence the compiler
}
Run Code Online (Sandbox Code Playgroud)

为什么编译器在这些情况下会有不同的反应?

注1:clang版本为3.6.2-svn240577-1~exp1

注2:我已经使用Compiler Explorer(gcc.godbolt.org)测试了许多其他版本的gcc,clang和icc.因此,所有测试版本的gcc(除了5.x)和icc都会发出警告.没有clang版本做到了.

c++ gcc clang gcc-warning c++11

7
推荐指数
2
解决办法
1827
查看次数

没有编译器警告明显的段错误

我很惊讶这个编译没有任何警告:

int main()
{ 
    *"abc" = '\0';
}
Run Code Online (Sandbox Code Playgroud)

gcc main.c -Wall -Wextraclang main.c -Weverything.

为什么没有这个警告?有没有办法不会引起分段错误?

c gcc clang segmentation-fault gcc-warning

7
推荐指数
1
解决办法
228
查看次数