[C언어오류] 에러코드 C2143 :: 구문 오류 : ';'이(가) '형식'앞에 없습니다.

두비니

·

2020. 4. 7. 12:00

 

 

 

 

 

 

 

 

리얼 역대급;;

 

 

얘는 AES암호화작업을 하다 생긴 일인데요, 

 

 

문제부분의 코드 일부를 가져왔습니다.

 

 

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include "aes.h"

void AES_Keyschedule(u8 MK[], u8 RK[], int keysize);		//여기서 발생
void AES_ENC(u8 PT[16], u8 RK[], u8 CT[16], int keysize);

u8 MUL(u8 a, u8 b) {
	u8 r = 0;
	u8 tmp = b;
	u32 i;
	for (i = 0; i < 8; i++) {
		if (a & 1)r ^= tmp;
		tmp = MUL2(tmp);
		a >>= 1;
	}
	return r;
}

int main() {

	u8 a, b, c;
	int i;
	u8 PT[16] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff };
	u8 MK[16] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 };
	u8 CT[16] = { 0x00, };
	u8 RK[240] = {0x00, };		//라운드수는 10, 12, 14라운드가 가능한데 최대인 14라운드(+1)만큼 만들어놓는다
	int keysize = 128;

	AES_Keyschedule(MK, RK, keysize);		//1R : RK 0~15, 2R: RK 16~31, ...
	AES_ENC(PT, RK, CT, keysize);

	/*
	a = 0xab;
	b = 0x38;
	c = MUL(a, b);
	//printf("%02x * %02x = %02x", a, b, c);
	//printf("Sbox(%02x) = %02x", a, GenSbox(a));

	printf("Sbox[256] = {\n");
	for (int i = 0; i < 256; i++) {
		printf("0x%02x, ", GenSbox((u8)i));
		if (i % 16 == 15)printf("\n");
	}*/

	return 0;

}

 

그냥 문제를 일으키는 부분하고 메인함수만 들고 왔습니다.

 

이렇게 짤라놓으면 잘 알 수 없지 않느냐, 할수도 있는데

 

일단 글을 끝까지 읽어주세요..

 

 

우선 풀코드를 돌리면 다음과 같은 에러가 뜹니다.

 

 

 

 

 

C2143 구문 오류: ';'이(가) '형식' 앞에 없습니다.(6번에서발생)

 

 

 

일단 이런걸 보시면 많이 당황하실 거예요....

 

'아니 세미콜론이 없다고? 나 다 맞췄는데???'

 

결론부터 얘기하자면 세미콜론때문에 생기는 에러가 아닐 수도 있습니다.

 

 

 

우선 이 에러는 크게 두가지로 나눌 수 있습니다.

 

 

1. 변수선언을 잘못 해준 경우 (오래된 컴파일러 사용시 문제발생)

 

 

C언어는 C++과는 다르게 변수선언부분이 제약되어있다.

 

예를 들어

 

funtion();

int n;

 

이런 식으로 변수 선언 앞에 함수가 있어서는 안된다.

 

 

....

 

 

는 한 5~6년전 이야기다.

 

정확히 언제, 몇번째 업데이트인지는 모르지만

몇년전부터는 C언어도 어디에 변수를 선언하든 상관이 없습니다.

 

뭐, 실제로 이런게 발생을 했다면 visual studio 2010같은거를 쓰고있다는건데,,

얼른 업데이트하시길..

 

 

 

2. 헤더파일의 문제

 

저도 맨처음에 구글링할때 1번같은 사례밖에 나오지 않았습니다...

 

그리고 문제를 해결하고나서야 알았지만 그런 에러 관련된 글들은 2014년 이후의 글이 없었습니다.

 

내가알기로는 변수가 어디에있든 상관없는데 왜 그런지 느낌이 쎄할때부터 알아봤어야했는데....

 

 

 

각설하고, 혹시라도 사용자 지정 헤더를 끌어와서 프로그램을 작성한 경우는 꼭 헤더파일에 세미콜론이 다들 잘 붙어있는지 보자.

 

저같은 경우는 aes.h라는 지정자 헤더파일을 이용했습니다.

 

 

typedef unsigned char u8;
typedef unsigned int u32;

Sbox[256] = {
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,

...
(생략)

0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 }

 

 

보면 딱봐도 Sbox라는 배열 뒤에 세미콜론을 붙이지 않았네요.....허허

 

실제 코드는 저 SBox배열이 256짜리여서 잘 안보이기도했고(변명)

 

진짜 짜증나는게 헤더파일의 문제를 c코드의 문제라고 되어있었던거....그래서 헤더파일은 볼생각도 안했었다...

 

 


 

!해결법!

 

 

1. ide 오래된거면 업데이트하세요

2. 개인 헤더 끌어오셨다면 헤더파일 잘 확인해보세요

 

 

 

 

 

 

이거 한줄때문에 3시간을 붙들고있었는데 친구의 도움으로 5초만에 해결ㅎㅎ;;;;;;;

 

 

 

 

 

책상 뿌술뻔 했다.

 

오늘의 교훈은 문제가 없는거같으면 헤더파일보는걸로,,,