6

によると、MISRA C++ 2-5-1通常、有向グラフを台無しにすることは避けるべきです。ただし、一般的な演算子、、 ...を定義するために、読み取り可能な単語 、 などのand使用も避ける必要がある理由がわかりません。ornot&&||

この問題は、Sonar/MISRA の「主要な」問題として強調されています。

[Major]     Open    Replace this digraph 'and' by its equivalent '&&'
[Major]     Open    Replace this digraph 'and' by its equivalent '&&'
[Major]     Open    Replace this digraph 'or' by its equivalent '||'    
[Major]     Open    Replace this digraph 'or' by its equivalent '||'    
[Major]     Open    Replace this digraph 'or' by its equivalent '||'

特定の理由で、ルールに人間が読める??=ダイグラフ (不可解な,とはまったく異なる)も含まれているのか、それともルールが一般的すぎるのか? それらを使用する際の特定のリスクや副作用は見つかりませんでしたが、間違っていますか???/

まとめ

この MISRA ルールに、人間が読めるダイグラフも含める機能上の理由はありますか? コードコンプライアンスルールをやみくもに満たすためだけにそれらを避けるべきですか、それとも背後に隠れている本当のトリッキーな理由がありますか?

4

1 に答える 1

2

Digraph と Trigraph はレキシカル シュガーにすぎません。コンパイラはそれらを他の単一文字に置き換えます。

MISRA C++ ルール 2-3-1 には、「トリグラフは使用しない」と記載されています。

Trigraph はすべて「??」で始まる文字です。そして、トライグラフが何を意味するかを定義する 3 番目の文字。(例: "??-" は "~" と同じです)

MISRA C++ 2008 はこれらを列挙しません。だから私は、すべてのトリグラフが意味されていると思います。これらは:

??= ??/ ??’ ??( ??) ??! ??< ??> ??-

MISRA C++ ルール 2-5-1 は、「ダイグラフは使用してはならない」と述べています。

Digraphs は、たとえば "<%" または "%>" ("{" と "}" に等しい) です。

MISRA C++ 2008 は、禁止されているものを列挙します。

<% %> <: :> %: %:%:

ダイグラフとトライグラフ

私にとってそれらは古代からの遺物です。たとえば、中括弧を使用せずに C++ プログラムを作成できます。それらはソースコードを読めなくします:

void a()
<%
    int b<:2:> = <%0, 0%>;
%>

私の知る限り、MISRA C++ 2008 には人間が読める論理演算子の使用を禁止する規則はありません (非常にまれですが)。これは、Sonar ルールが MISRA C++ 2008 よりも制限が厳しいことを意味します。これはバグだと思います。

私の意見では、C/C++ コミュニティは人間が読める論理演算子に慣れていません。したがって、それらは結果的に避けるべきです。

ところで: C++ 標準では、それらをトリグラフおよび「代替トークン」と呼んでいます。論理演算子の選択肢は、そのように列挙されています。

于 2014-06-27T20:56:26.310 に答える