2011-03-31 2 views
0

그래서, :ICC의 segfaulting는

#include <string> 

int foo() { 
    return 6; 
} 

int main() { 
    std::string t[foo()]; 
} 

는 두 개의 유사한 프로그램 다음, 그러나, 잘 실행하는 것.

#include <string> 

int foo() { 
    return 6; 
} 

int main() { 
    int f = foo(); 
    std::string t[f]; 
} 

#include <string> 

int foo() { 
    return 6; 
} 

int main() { 
    std::string t[6]; 
} 

나는 무슨 일이 일어나고 있는지에 대해 조금 혼란 스러워요. 외관상으로는 가변 길이 배열은 비표준이며, 항상 지원하는 g ++를 사용했기 때문에 이것은 놀랍습니다. 그러나 ICC가 지원하지 않는다면 왜 컴파일됩니까? 또한, 예제 2는 왜 "작동"합니까?

여기에 올바른 코드는 무엇입니까? 첫 번째 스 니펫이 올바르지 않은 경우 왜 컴파일되고 왜 세그 폴트됩니까?

2011 년 x86_64 Intel (R) Core (TM) i5에서 icc (ICC) 12.0.2 20110112를 사용하고 있습니다.

감사

+0

이것은 C++ 코드이므로 icc로 컴파일하는 방법을 모르겠다. – xcramps

+0

신경 쓰지 마라. 나는 ICC를 보았고 사용했던 .cpp 확장자를 알아 채지 못했다. icc는 icpc를 사용합니다. – xcramps

+0

버그처럼 보입니다. 대안으로'std :: vector > t (f())'는 어떨까요? –

답변

3

글쎄은 C++이 더 가변 길이 배열을 (C99 비록 않음)이없는 것은 사실이지만, 분명히 ICC는 코드가 실제로 을 컴파일하기 때문에, 확장으로 그들을 지원하지 않습니다 (그리고 두 번째 이후 스 니펫은 실제로 충돌하지 않고 실행됩니다.)

첫 번째 버전이 충돌하는 경우 해당 비표준 확장 ICC 구현시 버그 여야합니다.

+0

도움 주셔서 감사합니다. g ++에서 -pedantic으로 설정하고 비표준 확장 (배열이 벡터가 됨)으로 모든 문제를 해결했으며 이제는 인텔 컴파일러로 컴파일/실행하는 것처럼 보입니다. 인텔에게 버그 보고서를 제출하는 방법이 완전히 명확하지 않으므로 그대로 두겠습니다 ... 다시 한 번 감사드립니다. – Will