意味不明の警告

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
まだまだ

意味不明の警告

#1

投稿記事 by まだまだ » 18年前

こんにちは
さっそく質問ですが
環境:MS Visual Studio 2005
コンパイルしたとき下記のようなメッセージが出ました。

warning C4717: 'MyClass::getXXX' : すべてのコントロールのパス、関数を回帰するとランタイム スタック オーバーフローが発生します。


Q1:
「スタック オーバーフローの発生」って、実行する時の話ではないか、なぜコンパイル段階で出たのでしょうか。


MS Visual Studio 2005 help を調べたら、以下のように書いております。
/********** MS Visual Studio 2005 help:*************/

コンパイラの警告 (レベル 1) C4717

言語のフィルタ : すべて 言語のフィルタ : 複数 言語のフィルタ : Visual Basic 言語のフィルタ : C# 言語のフィルタ : C++ 言語のフィルタ : J# 言語のフィルタ : JScript
Visual Basic (宣言)
Visual Basic (使用法)
C#
C++
J#
JScript

エラー メッセージ
'function' : すべてのコントロールのパス、関数を回帰するとランタイム スタック オーバーフローが発生します。


関数を通るすべてのパスに、その関数の呼び出しが含まれています。この関数は、それ自体を再帰的に呼び出してからでなければ終了できないため、この関数は終了しません。

次の例では C4717 警告が生成されます。

コードのコピー
// C4717.cpp
// compile with: /W1 /c
// C4717 expected
int func(int x) {
if (x > 1)
return func(x - 1); // recursive call
else {
int y = func(0) + 1; // recursive call
return y;
}
}

int main(){
func(1);
}


//////////////////////////////////////////////////////////////////////////

Q2:
この例で何を説明したいでしょうか。(どこに悪いの?)

ご教授お願いします。

box

Re:意味不明の警告

#2

投稿記事 by box » 18年前

main関数から func(1); を実行すると、
func関数のelse句を実行しますね。戻り値はfunc(0)+1です。

さて今度は、func(0)を実行する必要が出ました。
func(0)を実行すると、func関数のelse句を実行しますね。戻り値はfunc(0)+1です。

またまた、func(0)を実行する必要が出ました。
func(0)を実行すると、func関数のelse句を実行しますね。戻り値はfunc(0)+1です。

またまたまた、func(0)を実行する必要が出ました。
func(0)を実行すると、func関数のelse句を実行しますね。戻り値はfunc(0)+1です。

... 以下、永久に続く。

これは大いにまずいですね。

tk-xleader

Re:意味不明の警告

#3

投稿記事 by tk-xleader » 18年前

>この例で何を説明したいでしょうか。(どこに悪いの?)

このコードでは、プログラムが終了せずに永遠にfanc()が呼ばれ続けます。なぜならば

(以下ソースコード引用)
int func(int x) { 
    if (x > 1) 
        return func(x - 1); // recursive call 
    else { 
        int y = func(0) + 1; // recursive call 
        return y; 
    } 
}
条件分岐のところで、どの条件に該当してもfuncが呼ばれてますよね。これでは、func()がどんな時も
呼び出される事になり、結局このループを抜けられないのです。
(func呼び出し→再帰的にfunc呼び出し→再帰的にfunc呼び出し………)
ちなみに、これをコンパイルしてできた実行ファイルは絶対に実行しないで下さい。最悪の場合はPCが
フリーズします。

まだ

Re:意味不明の警告(お礼)

#4

投稿記事 by まだ » 18年前

boxさま、 tkmakwins15さま
さっそくご返答ありがとうございました。

よくわかりました。
いまどきのコンパイラは賢いですね。

また宜しくお願いします

閉鎖

“C言語何でも質問掲示板” へ戻る