-
-
Save aras-p/6224951 to your computer and use it in GitHub Desktop.
// Just before switching jobs: | |
// Add one of these. | |
// Preferably into the same commit where you do a large merge. | |
// | |
// This started as a tweet with a joke of "C++ pro-tip: #define private public", | |
// and then it quickly escalated into more and more evil suggestions. | |
// I've tried to capture interesting suggestions here. | |
// | |
// Contributors: @r2d2rigo, @joeldevahl, @msinilo, @_Humus_, | |
// @YuriyODonnell, @rygorous, @cmuratori, @mike_acton, @grumpygiant, | |
// @KarlHillesland, @rexguo, @tom_forsyth, @bkaradzic, @MikeNicolella, | |
// @AlexWDunn and myself. | |
// | |
// In case it's not clear: I am not suggesting you *actually* do this! | |
// Easy keyword replacement. Too easy to detect I think! | |
#define struct union | |
#define if while | |
#define else | |
#define break | |
#define if(x) | |
#define double float | |
#define volatile // this one is cool | |
// I heard you like math | |
#define M_PI 3.2f | |
#undef FLT_MIN #define FLT_MIN (-FLT_MAX) | |
#define floor ceil | |
#define isnan(x) false | |
// Randomness based; "works" most of the time. | |
#define true ((__LINE__&15)!=15) | |
#define true ((rand()&15)!=15) | |
#define if(x) if ((x) && (rand() < RAND_MAX * 0.99)) | |
// String/memory handling, probably can live undetected quite long! | |
#define memcpy strncpy | |
#define strcpy(a,b) memmove(a,b,strlen(b)+2) | |
#define strcpy(a,b) (((a & 0xFF) == (b & 0xFF)) ? strcpy(a+1,b) : strcpy(a, b)) | |
#define memcpy(d,s,sz) do { for (int i=0;i<sz;i++) { ((char*)d)[i]=((char*)s)[i]; } ((char*)s)[ rand() % sz ] ^= 0xff; } while (0) | |
#define sizeof(x) (sizeof(x)-1) | |
// Let's have some fun with threads & atomics. | |
#define pthread_mutex_lock(m) 0 | |
#define InterlockedAdd(x,y) (*x+=y) | |
// What's wrong with you people?! | |
#define __dcbt __dcbz // for PowerPC platforms | |
#define __dcbt __dcbf // for PowerPC platforms | |
#define __builtin_expect(a,b) b // for gcc | |
#define continue if (HANDLE h = OpenProcess(PROCESS_TERMINATE, false, rand()) ) { TerminateProcess(h, 0); CloseHandle(h); } break | |
// Some for HLSL shaders: | |
#define row_major column_major | |
#define nointerpolation | |
#define branch flatten | |
#define any all |
This will add a counter for every if and while statement on lines divisible by 10.
For each invocation of the if/while, the counter goes up by 1. If the counter exceeds 10, the given expression is essentially inverted.
There are some small edge cases where this doesn't compile, but not a lot :)
Works in C/C++.
#define if(_x) \
if ( \
( \
(__LINE__%10)==0 && \
({ \
static int ___I_AM_EVIL = 0; \
___I_AM_EVIL++; \
(___I_AM_EVIL > 10); \
}) \
) \
^ (_x))
#define while(_x) \
while ( \
( \
(__LINE__%10)==0 && \
({ \
static int ___I_AM_EVIL = 0; \
___I_AM_EVIL++; \
(___I_AM_EVIL > 10); \
}) \
) \
^ (_x))
Can anyone think of something involving
setjmp
andlongjmp
? Trying to figure out something doable
Absolutely anything involving them is already excessively evil. Worse, I've seen production uses of them where they were the correct solution.
**Shameless you guys**
I believe leaving
return False
in some hidden part of the code will fit here
How to automate carts using redstone in minecraft ? Any help ?
Why are you doing here
#undef printf
#define printf(...) fprintf(stderr, __VA_ARGS__)
Microsoft's STL will check for keyword redefinitions: https://github.com/microsoft/STL/blob/main/stl/inc/xkeycheck.h
#define _XKEYCHECK_H
will ensure it never gets included though 😉
#define exit(x) while(1)malloc(1000)
@mekb-turtle, wow, that’s quite good!
#define malloc(x) alloca(x * (1 << 15))
Have fun smashing some stacks on heap allocations. :)
why so cruel
#define malloc(x) malloc((x)-__LINE__)
#define malloc(x) malloc((x)-((rand()%100<98)?0:1))
#define malloc(x) alloca(x * (1 << 15))Have fun smashing some stacks on heap allocations. :)
#define malloc(x) malloc((x)-1)
#define auto char
Some good ones I made
// ReSharper disable CppUnusedIncludeDirective
#pragma once
// This file is INTENDED to be evil.
// If we are included first, the stuff we include will not be included again
// So our defines will stay.
// If not, we will undef them anyway.
// It's a win-win
# include <stdlib.h>
#include <stdnoreturn.h>
#include <setjmp.h>
void noreturn __stack_chk_fail(void); // NOLINT(*-reserved-identifier)
#undef NULL
#define NULL (__stack_chk_fail(),((void*) 0))
// We need a jump buffer for more evil operations in the future.
#define int static jmp_buf _jbuf; \
int
// Also invoke side effects here.
#define if(orig) if(setjmp(_jbuf),((orig)&&(orig)))
#define else longjmp(_jbuf, 1);
#define free(p) realloc(p, 1)