2016-10-28 68 views
0

構造内のメンバーのオフセットを計算しようとしているときに、未定義の識別子が検出されました。offsetof()が使用されたときのCoverityスキャンエラーRW.UNDEFINED_IDENTIFIER

typedef struct A 
{ 
    uint8_t mem[10]; 
} A; 

size_t offset = offsetof(A, mem); // This line raises the error. 

正確なカバー率の説明は、「識別子mem is undefined」です。

memをmem [0]、mem []で置き換えようとしましたが、構造体Aからtypedefを削除しましたが、何も解決しないようです。誰かがカバレッジを揺るがす可能性のあるものへの指針を持っているなら、それは素晴らしいことでしょう。

[更新#1]: - のgcc/gの++ 5.4.0、7.5.1コベリティ

[更新#2、私はUbuntuのに16.04(4.4.0-38-ジェネリックカーネル)を使用しています]:このような構造を持つスタンドアロンtest.cのとコマンドラインオプションを、次のことコベリティ幸せを維持します:

cov-build --dir . cc -c test.c -o test -Werror -march=corei7 -g -fstrict-aliasing -fstack-protector -fstrict-overflow -Wall -Wextra -Wshadow -Wmissing-prototypes -Wstrict-prototypes -O3 -fomit-frame-pointer -fPIE. 

興味深いことに、私は全体のプロジェクトをコンパイルするとき、それは同じラインのためのエラーの束につながる:、UNDEFINED_IDENTIFIER ROUTINE_NOT_EMITTED、TYPE_IDENTIFIER_NOT_ALLOWED。

+0

オペレーティングシステム、コンパイラ、およびバージョンを提供できますか? –

+0

私はubuntu 16.04(kernel - 4.4.0-38-generic)、gcc/g ++ 5.4.0、カバー率7.5.1を使用しています。 – 0sn1s

答えて

0

Coverity 8.0.0.9と8.5.0.5とGCC 4.6.3と5.2.0を使用しているため、この問題を再現できません。私の再生器は:

#include <stdint.h> 
#include <stddef.h> 

typedef struct A 
{ 
    uint8_t mem[10]; 
} A; 

size_t offset = offsetof(A, mem); // This line raises the error. 

あなたはGCCで完全にコンパイルされていません。私はgcc -c test.cを私のコマンドラインとして使用しました。

offsetofはシステムヘッダーで定義されているマクロなので、マクロが展開されてもCoverityの難易度がわかります(コマンドライン上の展開と同じではありません)。 Coverityをこれを拒否するモードにする。良い次のステップは、あなたのソースファイルを前処理して、ここで前処理されたスニペットをコンパイラのコマンドラインと共に展開して、どのoffsetofに展開しているのかを確認することです。

+0

あなたは正しいです。スタンドアロンのテストファイルは、Coverityを幸せに保ちます。マクロ定義ではありません。完全なコマンドラインオプションを使用してオリジナルの投稿を更新しました。 – 0sn1s

+0

これは名前空間か条件付きコンパイルの問題でしょうか?スタンドアロンのテストケースが動作し、Coverityが識別子 'mem'を見つけることができないという不満を抱いていることを考えると、これはそのシンボルを見ていないことを示唆しています。問題の再現機能がなければ、私は推測するしかありませんが、最も可能性の高い原因は、コンパイラがCoverityにないマクロ定義があることです。構造体は#ifブロックまたは名前空間にラップされていますか? – Caleb

+0

でも、私はその気持ちを持っています。 #ifdefブロックに関するポインタをありがとう。それを確認させて。 – 0sn1s

関連する問題