Блог пользователя KrK

Автор KrK, 11 лет назад, По-английски

Hello,

I want to share my a bit weird experience with you guys. I was solving Tavas in Kansas and had some serious problems with debugging my solution. In the end, it was clear that the idea was correct, I just needed to focus on the implementation. I rewrote a small chunk of code and was astonished by the fact that it was equivalent, but it got accepted. I tried to play with my implementations a little. And guess what? I found out that assert() on an obvious condition can make your code work!

Proof: the failed submission and the accepted submission (only with the assert added, where k should be 1).

I generally do not have great knowledge of compilators and stuff like that. But maybe someone has the idea what the hell happened? :D

  • Проголосовать: нравится
  • +86
  • Проголосовать: не нравится

»
11 лет назад, скрыть # |
 
Проголосовать: нравится +40 Проголосовать: не нравится

Your code get AC with VC++ compiler. volatile int k = 0; also get AC. So problem is in G++ optimising.

»
11 лет назад, скрыть # |
 
Проголосовать: нравится +78 Проголосовать: не нравится

Seems like optimization bug. It is funny that -O2 replaced with -O3 makes your code correct.

It is not the first time codeforcers found a g++ bug, try to google like "codeforces g++ bug".

It will be really good to minimize your code and to file an issue in gcc bug-tracker. Good idea is to check your code with tools like valgrind to be sure that it is not an undefined behaviour.

»
11 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

fprintf(stderr, "%d", k); helps. or write something else to STDERR also helps.

link1

»
11 лет назад, скрыть # |
 
Проголосовать: нравится +11 Проголосовать: не нравится

Can't repeat with g++ (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6) and this test case.

»
11 лет назад, скрыть # |
 
Проголосовать: нравится -83 Проголосовать: не нравится

Never met any bugs in VC++. What's the purpose of using G++?

»
11 лет назад, скрыть # |
 
Проголосовать: нравится +8 Проголосовать: не нравится

Damn, feel so unsecure now. IOI uses g++ and most probably with -O2. And it is at least the 2nd g++ bug found by Codeforces. :/

»
11 лет назад, скрыть # |
 
Проголосовать: нравится +11 Проголосовать: не нравится

Added one more ticket to gcc issue-tracker: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66096

Can someone try it on other build of g++ 4.9.2 32-bit?

»
7 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Similar experience:

54145878 gives WA On test case 1 and just adding an assert makes it pass the first test case 54146095