Horrors of C++, Part 1: Lazyness + n00bness + macros = pwnage

Então já fiz o básico do Quivi e queria lançar a primeira versão dele. Fui compilar em modo Release, rodei, e… Esse programa encontrou um problema e será fechado.

A princípio, se um programa funciona em Debug, funciona em Release.

A estratégia mais óbvia para descobrir o que estava ocorrendo era ir mudando as configurações do Release em direção ao Debug, até o erro sumir. A primeira mudança foi ativar o debug no código para poder, bem, debuggar. No velho e bom step into e step over, me deparei com a linha culpada com a clássica reação “mas eu sou mesmo um idiota”.

assert(getItemType2(itemNumber) == TYPE_IMAGE);

Só de olhar o nome da função dá para perceber que um WTF está para vir. Tudo bem, fazer uma “versão 2” de uma função é uma coisa ridiculamente imbecil mas foi aqueles momentos de “ah, eu sei que tá tosco, depois eu refatoro”.

A função em si faz duas coisas: descobre o tipo do item em uma pasta, dado o seu índice, e ajusta o índice (o parâmetro é passado por referência) de modo que ele aponte a uma posição válida num certo vetor (que não vem ao caso).

Umas das regras básicas da programação: uma função só deve fazer uma e somente uma coisa.

Os mais entendidos já podem ter descoberto o que aconteceu: no modo Release, todos os assert’s (que é uma macro) não produzem código. São removidos. A função não era chamada, o que não daria problema se ela só checasse o tipo do item, mas ela também muda o valor do índice… Sem mudar, o índice acabava apontando para fora do vetor. Yay for buffer overflows!

(Claro que a culpa não é do C++. Mas o C++ pode ser muito cruel com novatos e gente desleixada.)

(Por outro lado, esse é mais um motivo pelo qual macros fazem mal à saúde.)

Uma resposta em “Horrors of C++, Part 1: Lazyness + n00bness + macros = pwnage”

Weeeee, boiei legal! E o céu não estava tão azul hoje, XD

Ah, sobre a Americanas, eu não estava criticando! Só mostrando a aleatoridade do webdesigner de non ter tirado o textinho do canto, hehehehe XD (Deve ser sido culpa de estágiario, heheh)

Deixe um comentário