- 1
- 2
- 3
- 4
fstat(fd, &s);
count = s.st_size % sizeof(uint32_t) == 0 ? s.st_size : s.st_size + (sizeof(uint32_t) - s.st_size % sizeof(uint32_t));
buf = malloc(count);
/* etc */
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+142
fstat(fd, &s);
count = s.st_size % sizeof(uint32_t) == 0 ? s.st_size : s.st_size + (sizeof(uint32_t) - s.st_size % sizeof(uint32_t));
buf = malloc(count);
/* etc */
Собственно, round up to nearest 32-bit word. Нет ли метода покрасивше?
+147
void Write_Char(char ch)
{
switch(ch)
{
case 'a':
{
set_mode_data;
set_db4_0;
set_db5_1;
set_db6_1;
set_db7_0;
strobe();
set_mode_data;
set_db4_1;
set_db5_0;
set_db6_0;
set_db7_0;
strobe();
return;
}
case 'b':
{
set_mode_data;
set_db4_0;
set_db5_1;
set_db6_1;
set_db7_0;
strobe();
set_mode_data;
set_db4_0;
set_db5_1;
set_db6_0;
set_db7_0;
strobe();
return;
}
case 'c':
{
set_mode_data;
set_db4_0;
set_db5_1;
set_db6_1;
set_db7_0;
strobe();
set_mode_data;
set_db4_1;
set_db5_1;
set_db6_0;
set_db7_0;
strobe();
return;
}
case 'd':
{
set_mode_data;
set_db4_0;
set_db5_1;
set_db6_1;
set_db7_0;
strobe();
set_mode_data;
set_db4_0;
set_db5_0;
set_db6_1;
set_db7_0;
strobe();
return;
}
case 'e':
{
set_mode_data;
set_db4_0;
set_db5_1;
set_db6_1;
set_db7_0;
strobe();
set_mode_data;
set_db4_1;
set_db5_0;
set_db6_1;
set_db7_0;
strobe();
return;
}
case 'f':
{ set_mode_data;
set_db4_0;
set_db5_1;
set_db6_1;
set_db7_0;
strobe();
set_mode_data;
set_db4_0;
set_db5_1;
set_db6_1;
set_db7_0;
strobe();
return;
}
//еще ~800 строк.
Ну почему тут только 100 строк можно вводить? Я хочу поделиться этим со всем миром, ведь это так легко - наговнокодить на Си.(из программы общения с дисплеем hd44780 для STM32)
+145
if (in)
goto out;
Найдено на просторах ядра (fsl_esai.c кому интересно). Не ГК само по себе но читается замечательно.
+142
if (false == very_long_function(arg1, arg2, ...))
{
if (false == very_long_other_function(even_more_args)
{
do_something();
}
else
{
do_something_else();
}
}
И вот такими многоэтажками забит весь проект.
+140
void GetPublicKey(char *destination, int len)
{
GetPrivateKey(destination, len);
}
+137
static const uint32_t frequencies[] = {
#include "frequencies.h"
};
+142
#include <inttypes.h>
#include <stdio.h>
typedef union
{
struct
{
#define BITG(n) uint8_t bit##n : 1
BITG(0);
BITG(1);
BITG(2);
BITG(3);
BITG(4);
BITG(5);
BITG(6);
BITG(7);
#undef BITG
} bits;
uint8_t value;
}getbit;
uint8_t bit_sum(uint8_t, uint8_t);
uint8_t bit_sum(uint8_t a, uint8_t b)
{
getbit op1, op2, opr;
uint8_t carry;
op1.value=a; op2.value=b;
#define OP1(n) op1.bits.bit##n
#define OP2(n) op2.bits.bit##n
#define OPR(n) opr.bits.bit##n
#define XOR(a,b) ((a)^(b))
#define AND(a,b) ((a)&(b))
OPR(0) = XOR(OP1(0), OP2(0));
carry = AND(OP1(0), OP2(0));
#define SETBIT(n) \
OPR(n) = XOR \
( \
carry, \
XOR(OP1(n), OP2(n)) \
);
#define CARRYBIT(n) \
carry = XOR \
( \
AND(OP1(n), OP2(n)), \
AND \
( \
XOR(OP1(n), OP2(n)), \
carry \
) \
);
SETBIT(1);
CARRYBIT(1);
SETBIT(2);
CARRYBIT(2);
SETBIT(3);
CARRYBIT(3);
SETBIT(4);
CARRYBIT(4);
SETBIT(5);
CARRYBIT(5);
SETBIT(6);
CARRYBIT(6);
SETBIT(7);
return opr.value;
#undef SETBIT
#undef CARRYBIT
#undef OP1
#undef OP2
#undef OPR
#undef XOR
#undef AND
}
int main (int argc, char *argv[], char *envp[])
{
uint8_t a, b, c;
scanf ("%"SCNu8"%"SCNu8, &a, &b);
c = bit_sum(a,b);
printf("%"PRIu8"\n", c);
return 0;
}
Побитовое сложение двух 8-битных чисел по схеме двоичного сумматора
+105
x = x + exp(ln(2)*i);
Встретил в коде опроса датчика, не сразу понял, что это делает.
Когда понял, понял что лучше бы не понимал.
+132
struct ass {
void (*func)(const char *, void *);
void *data;
} asses[] = {
{ NULL, NULL },
/* Тут типа scanf */
{ NULL, NULL },
};
while (getopt_long_only(argc, argv, "", long_options, &option_index) != -1) {
if (option_index < 0)
return 1;
struct ass *derp = &asses[option_index];
if (derp->func != NULL)
derp->func(optarg, derp->data);
}
Правим код начальника.
+138
if(argc > 6){
for(arg = argv[6]; strlen((char *)arg) >= 17 &&
isdigit(arg[0]) &&
isdigit(arg[1]) &&
isdigit(arg[3]) &&
isdigit(arg[4]) &&
isdigit(arg[6]) &&
isdigit(arg[7]) &&
isdigit(arg[9]) &&
isdigit(arg[10]) &&
isdigit(arg[12]) &&
isdigit(arg[13]) &&
isdigit(arg[15]) &&
isdigit(arg[16])
; arg+=18){
int t1, t2;
struct period *sp;
t1 = (arg[0] - '0') * 10 + (arg[1] - '0');
t1 = (t1 * 60) + (arg[3] - '0') * 10 + (arg[4] - '0');
t1 = (t1 * 60) + (arg[6] - '0') * 10 + (arg[7] - '0');
t2 = (arg[9] - '0') * 10 + (arg[10] - '0');
t2 = (t2 * 60) + (arg[12] - '0') * 10 + (arg[13] - '0');
t2 = (t2 * 60) + (arg[15] - '0') * 10 + (arg[16] - '0');
if(t2 < t1) break;
sp = myalloc(sizeof(struct period));
if(sp){
sp->fromtime = t1;
sp->totime = t2;
sp->next = acl->periods;
acl->periods = sp;
}
if(arg[17]!=',') break;
}
}
Получение временных диапазонов, из https://github.com/z3APA3A/3proxy/blob/devel/src/3proxy.c#L1470
Основное говно в том, что нифига не проверяются входные данные т.е. секунд и минут может быть больше 59, а часов может быть больше 23. И проверку if(t2 < t1) лучше заменить на if(t2 <= t1)
А еще там в том исходнике в качестве отступов используются и пробелы и табы. Вообще там очень много говнокода