PVS Studio.VSред GCC рдХрд╛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд╡рд┐рд╢реНрд▓реЗрд╖рдг 10. рд╕реНрд╡рддрдВрддреНрд░ рдорд┐рдиреА-рдкрд░реАрдХреНрд╖рдг

рдЬреАрд╕реАрд╕реА 10 рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рд▓реЗрдЦ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ , рдФрд░ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдкреВрдЫрд╛: "рдХреНрдпреЛрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЕрдкрдиреЗ рдЙрддреНрдкрд╛рдж рдХреЛ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ , рдФрд░ рд╡реЗ рдирд╣реАрдВ рдЫрд┐рдкрд╛рддреЗ рд╣реИрдВ рд╡реЗ рдХреНрдпрд╛ рд╣реИрдВ? "
Andrey2008рд╣рд╛рдВ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред рдПрдХ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рддреНрд░реБрдЯрд┐ рдХреЛ рдкрдХрдбрд╝рд╛ / рдкрдХрдбрд╝рд╛ рдирд╣реАрдВ рдЧрдпрд╛, рдпрд╣ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣рддрд╛ рд╣реИ
рдХреНрдпрд╛ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдЕрдкрдиреЗ рдЙрддреНрдкрд╛рдж рдХреЗ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ рдЪрд▓рд╛рдиреЗ рдЪрд╛рд╣рд┐рдП рдФрд░ рдРрд╕реЗ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдирд╣реАрдВ рддреЛ рдХреИрд╕реЗ!

рдЕрд╕рд▓ рдореЗрдВ, рдореБрдЭреЗ рдЗрд╕реЗ рдЦреБрдж рдХрд░рдирд╛ рдерд╛ред

рдЯреЗрд╕реНрдЯ рдирдВрдмрд░ 1ред рдПрдХ рдбрдмрд▓-рдлреНрд░реА рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг


рдХреЗ рд╕рд╛рде рдХрд╛ рдирд┐рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛:
V586 'рдореБрдХреНрдд' рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рд╣реА рдореЗрдореЛрд░реА рд╕реНрдкреЗрд╕ рдХреЗ рдбреАрдХреНрд▓реЛрдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рджреЛ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рддрд░реНрдХ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░реЗрдВред рдЪреЗрдХ рд▓рд╛рдЗрдиреЗрдВ: 5, 6. 1_dbl_free.c 6

рдкрд╛рд╕

рдЯреЗрд╕реНрдЯ рдирдВрдмрд░ 2 longjmp () рдореБрдлреНрдд рдореЗрдВ ()


рдореЙрд▓реЛрдХ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рдкрд░ рд╢рдкрде рдЧреНрд░рд╣рдг, рд▓реЗрдХрд┐рди рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ - рджреБрд░реНрдЧрдо рдХреЛрдб рдФрд░ рдЕрдкреНрд░рдпреБрдХреНрдд рдореЗрдореЛрд░реА:
V118 рдореЙрд▓реЛрдХ () рдлрд╝рдВрдХреНрд╢рди рдПрдХ рддрд░реНрдХ рдХреА рдХреНрд╖рдорддрд╛ рдореЗрдВ рдПрдХ рдЦрддрд░рдирд╛рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред 2_longjump.c 13
V779 рдЕрдЧрдореНрдп рдХреЛрдб рдХрд╛ рдкрддрд╛ рдЪрд▓рд╛ред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдореМрдЬреВрдж рд╣реЛред 2_longjump.c 15
V799 рдореЗрдореЛрд░реА рдХреЗ рдмрд╛рдж 'ptr' рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдЪрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред 2_longjump.c 13

рдкрд╛рд░рд┐рдд

рдЯреЗрд╕реНрдЯ рдирдВрдмрд░ 3ред рдорд▓реНрд▓реЛрдХ () рд▓реАрдХреНрд╕ рдФрд░ рдлреЛрдкреЗрди () рдЕрд╢реБрджреНрдз рдлрд╛рдЗрд▓реЗрдВ


рдорд┐рд▓рд╛:
V118 рдореЙрд▓реЙрдХ () рдлрд╝рдВрдХреНрд╢рди рдПрдХ рддрд░реНрдХ рдХреА рдХреНрд╖рдорддрд╛ рдореЗрдВ рдПрдХ рдЦрддрд░рдирд╛рдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред 3_fopen.c 7
V773 'f' рдлрд╝рд╛рдЗрд▓ рд╣реИрдВрдбрд▓ рдХреА рджреГрд╢реНрдпрддрд╛ рдХреА рдЧреБрдВрдЬрд╛рдЗрд╢ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдВрдж рдХрд┐рдП рдмрд┐рдирд╛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЧрдИ рдереАред рдПрдХ рд╕рдВрд╕рд╛рдзрди рд░рд┐рд╕рд╛рд╡ рд╕рдВрднрд╡ рд╣реИред 3_fopen.c 9
V773 'p' рдкреЙрдЗрдВрдЯрд░ рдХреА рд╡рд┐рдЬрд┐рдмрд┐рд▓рд┐рдЯреА рд╕реНрдХреЛрдк рдореЗрдореЛрд░реА рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рдХрд┐рдП рдмрд┐рдирд╛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЧрдпрд╛ рдерд╛ред рдПрдХ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рд╕рдВрднрд╡ рд╣реИред 3_fopen.c 9
V799 рдореЗрдореЛрд░реА рдХреЗ рдмрд╛рдж 'p' рд╡реЗрд░рд┐рдПрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдЪрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред 3_fopen.c 7

рдЙрддреНрддреАрд░реНрдг

рдЯреЗрд╕реНрдЯ рдирдВрдмрд░ 4ред рдЗрд╕реЗ рдЦрд╛рд▓реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореЗрдореЛрд░реА рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдирд╛


рдмрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛:
V774 'n' рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЗрдореЛрд░реА рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред 4_use_after_free.c 9
V591 рдЧреИрд░-рд╢реВрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред 4_use_after_free.c 11

рдЙрддреНрддреАрд░реНрдг

рдкрд░реАрдХреНрд╖рдг рд╕рдВрдЦреНрдпрд╛ релред рдиреЙрди-рд╣реАрдк рдкреЙрдЗрдВрдЯрд░ рд░рд┐рд▓реАрдЬрд╝ рдХрдВрдЯреНрд░реЛрд▓ (рд╣реАрдк)


рдЧреИрд░-рддреНрд░реБрдЯрд┐ рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХреА рдЧрдИ рдереА:
рдПрдХ рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреЛ рдпрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 'n' рдХрд╛ V104 рдирд┐рд╣рд┐рддрд╛рд░реНрде рд░реВрдкрд╛рдВрддрд░рдг: sizeof (int) * n 5_free_nonheap.c 11
V799 'ptr' рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдЪрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред 5_free_nonheap.c 11

рд╡рд┐рдлрд▓

рдЯреЗрд╕реНрдЯ рдирдВрдмрд░ 6ред рд╕рд┐рдЧреНрдирд▓ рдХреЗ рдЕрдВрджрд░ рдЕрдорд╛рдиреНрдп рдХреЙрд▓ () рд╣реИрдВрдбрд▓рд░


рдЕрд╕рдлрд▓

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдРрд╕рд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд┐рджрд╛рди рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдирд╣реАрдВ рджреЛрд╣рд░рд╛рдКрдВрдЧрд╛ред

рдЕрдЧрд▓рд╛, рдореИрдВ рдЬреАрд╕реАрд╕реА 10 рдореЗрдВ рдирд┐рджрд╛рди рдХреА рд╕реВрдЪреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧрдпрд╛ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛, рдЗрд╕рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХреЗ рдкрд░реАрдХреНрд╖рдгред

рдЯреЗрд╕реНрдЯ рдирдВрдмрд░ 7ред рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбрдмрд▓ рдмрдВрдж рдХрд░рдирд╛ рдФрд░ рдмрдВрдж рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЬрд╛рд░реА рдХрд░рдирд╛ *


рдкреАрд╡реАрдПрд╕ рдиреЗ рдЗрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ
рд▓рдЧрд╛рдпрд╛ рдЬреАрд╕реАрд╕реА 10 рдиреЗ рдбрдмрд▓-рдлреЙрд▓реНрдХреЛрдЬ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рд▓реЗрдХрд┐рди рдПрдХ рдмрдВрдж рд╣реИрдВрдбрд▓ рдХреЗ рд▓рд┐рдП рдореБрдлреНрдд рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ред

#include <stdlib.h>
void closefile(FILE* f) {
	fclose(f);
}

void test(const char *filename) {
  FILE *f = fopen(filename, "r");
  void *p = malloc(1024);
  /* do stuff */
  closefile(f);
  fclose(f);
  free (p);
  free(f);  // <-  UB
}

рдЕрдиреБрддреНрддреАрд░реНрдг рд╣реЛрдирд╛

рдЯреЗрд╕реНрдЯ рдирдВрдмрд░ 8ред longjmp () рдПрдХ рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╕реНрдЯреИрдХ рдкрд░


рдкреАрд╡реАрдПрд╕ рдиреЗ рдХреБрдЫ рднреА рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЬреАрд╕реАрд╕реА 10 рдиреЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛

#include <setjmp.h>
#include <stdlib.h>
static jmp_buf env;
static int i;

static void inner(void) {
  longjmp(env, 1);
}

static void middle(void) {
  inner();
}

void outer(void) {
  i = setjmp(env);
}

void outer_x2(void) {
  outer();
  if (i == 0)
    middle();
}

рдЕрдиреБрддреНрддреАрд░реНрдг рд╣реЛрдирд╛

рдЯреЗрд╕реНрдЯ рдирдВрдмрд░ 9ред рдЪрд░ рдХреЛ рдвреЗрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рд▓реМрдЯреЗрдВ


рджреЛрдиреЛрдВ рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрд╕рдлрд▓, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЬреАрд╕реАрд╕реА рдЗрд╕ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ -fanalyzer рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ (рдпрд╛ рдЗрд╕реЗ рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред

#include<stdlib.h>

struct str1 {
    char buf[10];
};

struct str1 * ret(int sel)
{
    struct str1  var1, *pval;

    if(sel == 1)
        pval = &var1;
    else if(sel != 1)
        pval = (struct str1 *)malloc(1000);

    return pval;
}

рдЕрдиреБрддреНрддреАрд░реНрдг рд╣реЛрдирд╛

рдЯреЗрд╕реНрдЯ рдирдВрдмрд░ 10ред рджрд╛рдЧреА-рд╕рд░рдгреА-рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдФрд░ рдЙрдкрдпреЛрдЧ-рдХреЗ-рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓рд┐рдЬреНрдб-рд╡реИрд▓реНрдпреВ рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХреНрд╕


рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдХрд┐ рд╡реЗ GCC10 рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ- рдлреИрдирд▓рд╛рдЗрдЬрд╝рд░ рдЕрднреА рддрдХ ред

рдкреАрд╡реАрдПрд╕ рдЗрд╕реЗ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдХрдИ рдмрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдмреАрддрдиреЗ рдХреЗ

рдирд┐рд╖реНрдХрд░реНрд╖


рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреБрдЫ рдХрдорд┐рдпреЛрдВ рдХреЗ рдмрд┐рдирд╛, рдпрд╣ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдХрдИ рдорд╛рдирд╡ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рди рдХреЗрд╡рд▓ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╕реЗред

All Articles