Splintはスタック変数へのポインタのmaxSetをチェックできません

マルク

私は次のようなことをするプログラムを持っています:

#include <stdio.h>
#include <stdlib.h>

int f(char *result)
{
    if (result != NULL)
    {
        *result = 'a';
    }
    return 0;
}

int main ()
{
    char s = 0;
    (void)f(&s);
    printf("f gave %c\n", s);
    return 1;
}

関数へのポインターを渡し、それを逆参照して、何かを格納します。SplintはmaxSet(result) >= 0、f制約を解決できないと報告しています。

test.c: (in function f)
test.c:8:9: Possible out-of-bounds store: *result
    Unable to resolve constraint:
    requires maxSet(result @ test.c:8:10) >= 0
     needed to satisfy precondition:
    requires maxSet(result @ test.c:8:10) >= 0
  A memory write may write to an address beyond the allocated buffer. (Use
  -boundswrite to inhibit warning)

&sスタック上の単一の文字を指しているため、注釈を追加せずにmaxSetを1にする必要があります。なぜスプリントは不平を言っているのですか?

クロウマン

私の知る限り、スプリントは、実際のバッファーまたは配列を検証可能に指していないポインターでは制約を検証できないと報告しています。1の配列に相当する単一の変数を処理できなかった理由はないように思われるため、これは奇妙に思えますが、そうであるようです。

たとえば、次のコードを使用します。

int main (void)
{
    int a = 5;
    int b[1] = {6};
    int * pa = &a;
    int * pb = b;

    char c = (char) 0;
    char d[1] = {(char) 0};
    char * pc = &c;
    char * pd = d;

    *pa  = 6;       /*  maxSet warning  */
    *pb  = 7;       /*  No warning      */
    *b   = 8;       /*  No warning      */

    *pc = 'b';      /*  maxSet warning  */
    *pd = 'c';      /*  No warning      */
    *d  = 'd';      /*  No warning      */

    return 0;
}

スプリントは次の出力を提供します。

paul@thoth:~/src/sandbox$ splint -nof +bounds sp.c
Splint 3.1.2 --- 20 Feb 2009

sp.c: (in function main)
sp.c:15:5: Possible out-of-bounds store: *pa
    Unable to resolve constraint:
    requires maxSet(&a @ sp.c:7:16) >= 0
     needed to satisfy precondition:
    requires maxSet(pa @ sp.c:15:6) >= 0
  A memory write may write to an address beyond the allocated buffer. (Use
  -boundswrite to inhibit warning)
sp.c:19:5: Possible out-of-bounds store: *pc
    Unable to resolve constraint:
    requires maxSet(&c @ sp.c:12:17) >= 0
     needed to satisfy precondition:
    requires maxSet(pc @ sp.c:19:6) >= 0

Finished checking --- 2 code warnings
paul@thoth:~/src/sandbox$ 

(一つの要素)の配列の最初の文字へのポインタを間接参照し、配列名自体を逆参照、両方のエラーを生じないが、の両方、ない単一の変数にだけポイントポインタ間接参照場所charとをint奇妙な振る舞いのように見えますが、それはそれが何であるかです。

ちなみに、あなたのf()関数では、で何をresult指しているのかを実際に推論することはできませんmain()これらの2つの関数を分離しresultて見ると、スプリントが知る限り、有効な参照となるはずのもの指していることは明らかですがf、他の翻訳ユニットからさらに多くの呼び出しが行われる可能性があり、それはわかりません。何がresult中を指している可能性があり、それらのそれはちょうどそれがために持っている情報で行かなければならないので、場合によってf()、それ自体の。

たとえば、ここで:

static void f(char * pc)
{
    if ( pc ) {
        *pc = 'E';      /*  maxSet warning  */
    }
}

int main(void)
{
    char c[25] = "Oysters and half crowns.";
    *c = 'U';           /*  No warning      */

    f(c);

    return 0;
}

スプリントは、の割り当てについて警告しますが、の割り当てについては警告しf()ませんmain()。これはまさにこの理由によるものです。ただし、注釈を付けると、それを理解するのに十分な情報があります。

static void f(char * pc) /*@requires maxSet(pc) >= 0; @*/
{
    if ( pc ) {
        *pc = 'E';      /*  No warning      */
    }
}

int main(void)
{
    char c[25] = "Oysters and half crowns.";
    *c = 'U';           /*  No warning      */

    f(c);

    return 0;
}

ただし、ここでもc、単一char変更すると、スプリントは注釈付き制約が満たされていることを確認しないため、説明したのと同じ問題が発生します。したがって、次のようになります。

static void f(/*@out@*/ char * pc) /*@requires maxSet(pc) >= 0; @*/
{
    if ( pc ) {
        *pc = 'E';      /*  No warning      */
    }
}

int main(void)
{
    char c;
    f(&c);              /*  maxSet warning  */

    return 0;
}

あなたにこれを与えます:

paul@thoth:~/src/sandbox$ splint -nof +bounds sp3.c
Splint 3.1.2 --- 20 Feb 2009

sp3.c: (in function main)
sp3.c:11:5: Possible out-of-bounds store: f(&c)
    Unable to resolve constraint:
    requires maxSet(&c @ sp3.c:11:7) >= 0
     needed to satisfy precondition:
    requires maxSet(&c @ sp3.c:11:7) >= 0
     derived from f precondition: requires maxSet(<parameter 1>) >= 0
  A memory write may write to an address beyond the allocated buffer. (Use
  -boundswrite to inhibit warning)

Finished checking --- 1 code warning
paul@thoth:~/src/sandbox$ 

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Splintはスタック変数へのポインタのmaxSetをチェックできません

分類Dev

ベクターへのポインタによって呼び出されたメソッドはオブジェクトを変更できません

分類Dev

TFSへの変更をチェックインできません

分類Dev

TFSへの変更をチェックインできません

分類Dev

AngularUIのチェックボックスボタンの背景色は変更できません

分類Dev

入力タイプのチェックボックスはチェックできません

分類Dev

mysqlのタイムスタンプ値をtime.Time変数にフェッチできません

分類Dev

リッチフェイスのタブをクリックしてtabPanelのタブを変更することはできません4

分類Dev

複数のラジオボタンをチェックできません

分類Dev

マット-チェックボックスのカスタムカラーは変更できません

分類Dev

チェックボックス用のUWPCustomRenderer:チェックボックス上のポインターはスタイルを変更しますか?

分類Dev

オブジェクトを指すポインタのメソッドにアクセスできません

分類Dev

SmalltalkPharo-スレッド内のクラスインスタンス変数を更新できません

分類Dev

`||`、 `!a ||のチェックインなし a.method`は複数の変数で実行できません

分類Dev

CSSでチェックボックスのスタイルを設定できませんか?

分類Dev

スタックオブジェクトへの所有ポインタを作成できますか

分類Dev

NULLをオブジェクトへのポインタ型に変換できません

分類Dev

Tkinterチェックボタンステータスの取得:TclError:「PY_VAR」を読み取れません:そのような変数はありません

分類Dev

チェックボタンの状態を変更してもtkinter変数は変更されません

分類Dev

インターフェイスタイプが「NSString」のオブジェクトを値で可変個引数関数に渡すことはできません。フォーマット文字列からの予期されたタイプは「id」でした

分類Dev

Swiftの通常のクラスはUIButtonからタッチイベントを受信できません

分類Dev

チェックボックスは、ノックアウトのデータバインドでチェックされたままになりません

分類Dev

コントローラのフェッチポストデータにアクセスできません:Codeigniter

分類Dev

スタック変数へのポインタは揮発性である必要がありますか?

分類Dev

PluginManager :: getは、FileQueryPluginのインスタンスをフェッチまたは作成できませんでした

分類Dev

ポインタまたはスタック変数の宣言

分類Dev

バイナリ型のパターンマッチングでは、変数の値を使用できません

分類Dev

トピックのメタデータをフェッチしているときに、kafkajsクライアント(Node.js / express.js)が「TypeError:topics.forEachは関数ではありません」をスローするのはなぜですか?

分類Dev

新しいスレッドのスタック変数へのポインターを渡します-このコードは安全ですか?

Related 関連記事

  1. 1

    Splintはスタック変数へのポインタのmaxSetをチェックできません

  2. 2

    ベクターへのポインタによって呼び出されたメソッドはオブジェクトを変更できません

  3. 3

    TFSへの変更をチェックインできません

  4. 4

    TFSへの変更をチェックインできません

  5. 5

    AngularUIのチェックボックスボタンの背景色は変更できません

  6. 6

    入力タイプのチェックボックスはチェックできません

  7. 7

    mysqlのタイムスタンプ値をtime.Time変数にフェッチできません

  8. 8

    リッチフェイスのタブをクリックしてtabPanelのタブを変更することはできません4

  9. 9

    複数のラジオボタンをチェックできません

  10. 10

    マット-チェックボックスのカスタムカラーは変更できません

  11. 11

    チェックボックス用のUWPCustomRenderer:チェックボックス上のポインターはスタイルを変更しますか?

  12. 12

    オブジェクトを指すポインタのメソッドにアクセスできません

  13. 13

    SmalltalkPharo-スレッド内のクラスインスタンス変数を更新できません

  14. 14

    `||`、 `!a ||のチェックインなし a.method`は複数の変数で実行できません

  15. 15

    CSSでチェックボックスのスタイルを設定できませんか?

  16. 16

    スタックオブジェクトへの所有ポインタを作成できますか

  17. 17

    NULLをオブジェクトへのポインタ型に変換できません

  18. 18

    Tkinterチェックボタンステータスの取得:TclError:「PY_VAR」を読み取れません:そのような変数はありません

  19. 19

    チェックボタンの状態を変更してもtkinter変数は変更されません

  20. 20

    インターフェイスタイプが「NSString」のオブジェクトを値で可変個引数関数に渡すことはできません。フォーマット文字列からの予期されたタイプは「id」でした

  21. 21

    Swiftの通常のクラスはUIButtonからタッチイベントを受信できません

  22. 22

    チェックボックスは、ノックアウトのデータバインドでチェックされたままになりません

  23. 23

    コントローラのフェッチポストデータにアクセスできません:Codeigniter

  24. 24

    スタック変数へのポインタは揮発性である必要がありますか?

  25. 25

    PluginManager :: getは、FileQueryPluginのインスタンスをフェッチまたは作成できませんでした

  26. 26

    ポインタまたはスタック変数の宣言

  27. 27

    バイナリ型のパターンマッチングでは、変数の値を使用できません

  28. 28

    トピックのメタデータをフェッチしているときに、kafkajsクライアント(Node.js / express.js)が「TypeError:topics.forEachは関数ではありません」をスローするのはなぜですか?

  29. 29

    新しいスレッドのスタック変数へのポインターを渡します-このコードは安全ですか?

ホットタグ

アーカイブ