나는 배열 및 기본 생성자와 C++ 클래스 Matrix22
있습니다컴파일러가 스택에 충분한 공간을 예약하지 않는 이유는 무엇입니까?
class Matrix22{
/* something more */
double mat[2][2];
Matrix22(){
for(int i=0; i<2; i++)
for(int j=0; j<2; j++)
mat[i][j] = i==j ? 1.0 : 0.0;
}
};
나는 내 프로그램에서 그것을 사용 세그먼트 오류를 얻었다. 나머지는 매우 어렵고 복잡했기 때문에 나는 단지 Matrix22()
을 호출하는 간단한 테스트 루틴을 작성했습니다. 더 이상 세그 폴트가 아닙니다.
그런 다음 문제를 디버그하기 위해 gdb
을 실행했습니다. 별도의 테스트 루틴에서 생성자를 호출하면 gcc
은 멤버 mat
에 대한 일부 메모리를 예약합니다. 나는 스택을 탐색 할 수 있고 배열 다음에 몇 바이트 뒤에 리턴 주소를 볼 수있다.
주 프로그램에서 컴파일러는 충분한 공간을 예약하지 않습니다. 첫 번째 요소 (mat[0][0]
)가 쓰여 지지만 더 많은 쓰기가 다음 스택 프레임을 덮어 씁니다. 또한 생성자 전에 bt
명령이 올바른 백 트레이스를 반환하는지 확인합니다. 여기서 중요한 할당 후에 백 트레이스가 손상되었는지 확인할 수 있습니다.
내 질문은 : 한 경우 컴파일러 (또는 링커?) 배열에 대한 충분한 공간을 예약하지 않는 반면, 다른 경우에는 일어나지 않는 이유는 무엇입니까?
추 신 : 두 "테스트 케이스"는 동일한 컴파일러와 플래그로 컴파일되고 동일한 오브젝트 파일에 대해 alsolink됩니다.
편집 :
여기가 독방 감금 오류없이 작동하는 "간단한"테스트 케이스이다 :
와 코드가 독방 감금 오류가 클래스ModuleShaddower
(혼합 헤더 및 구현)에 생성
void test_Matrix22()
{
Framework::Math::Matrix22 matrix;
}
:
class ModuleShaddower{
public:
ModuleShaddower(PVModule& module, const EnvironmentalSetup& setup, const Position& position);
private:
Matrix22 rotMatrix90;
};
ModuleShaddower::ModuleShaddower(PVModule& module, const EnvironmentalSetup& setup, const Position& position)
: module (module), position(position), setup(setup), logger(LoggerFactory::getLoggerInstance())
{
double mat[][2] = {{0, -1},{1, 0}}; // This line will never be reached
rotMatrix90 = Matrix22(mat);
}
알다시피, 그것은 나머지 부분에서부터입니다. 아마도 문제가되는 코드를 추출하려고 시도하지만 이것이별로 도움이되지 않을 것이라고 생각합니다.
완벽한 테스트 케이스를 제공 할 수 있습니까? (실패한 사람) –
올리 (Oli)의 말 : 당신이 수업을 어떻게 사용하고 있는지 보여주십시오. –
짧은 테스트는 문제가되지 않습니다. 긴 버전에는 수천 줄의 코드가 있습니다. –