free(reg); sanitizer nie wykrywa ze brak free() a valgrind to wykrywa
#include <regex.h>
#include <stdio.h>
#include <stdlib.h>
void print_regerror (int errcode, size_t length, const regex_t * compiled) {
if (! compiled) {
fputs("regex is null", stderr);
exit(EXIT_FAILURE);
}
char* buffer = calloc(length, sizeof(char));
regerror (errcode, compiled, buffer, length);
fprintf(stderr, "Regex match failed: %s\n", buffer);
free(buffer);
}
void compile_regex(regex_t * regex, const char * pattern, const int cflags) {
if (! pattern || ! regex) {
fputs("regex or regex's pattern is null\n", stderr);
exit(EXIT_FAILURE);
}
int result = regcomp(regex, pattern, cflags);
if (0 != result) {
size_t length = regerror (result, regex, NULL, 0);
print_regerror (result, length, regex);
exit(EXIT_FAILURE);
}
}
int main(const int argc, const char * argv[]) {
regex_t * reg = malloc(sizeof(regex_t));
compile_regex(reg, "^[[:upper:]][[:lower:]]*( [[:upper:]][[:lower:]]*)?$", REG_EXTENDED);
regfree(reg); /*
free(reg); sanitizer nie wykrywa ze brak free */
}
#gcc -Wfatal-errors -Wall -Wextra -Wconversion -std=c11 -c reg.c -o v_reg.o
#gcc -Wfatal-errors -Wall -Wextra -Wconversion -std=c11 v_reg.o -o v_reg
# valgrind --leak-check=full --show-leak-kinds=all ./v_reg
# valgrind wg mnie wskazuje na poprawne wyniki
#gcc -Wfatal-errors -Wall -Wextra -Wconversion -std=c11 -fsanitize=address -c reg.c -o s_reg.o
#gcc -Wfatal-errors -Wall -Wextra -Wconversion -std=c11 -fsanitize=address -static-libasan s_reg.o -o s_reg
# ./s_reg
# sanitizer wg mnie wskazuje niepoprawny wynik
CC = gcc
CFLAGS = -Wfatal-errors -Wall -Wextra -Wconversion -std=c11
LDFLAGS =
PROGRAMS = v_reg s_reg
.PHONY: clean all
all: $(PROGRAMS)
v_reg: v_reg.o
$(CC) $(CFLAGS) $(LDFLAGS) v_reg.o -o v_reg
v_reg.o: reg.c
$(CC) $(CFLAGS) -c reg.c -o v_reg.o
s_reg: s_reg.o
$(CC) $(CFLAGS) -fsanitize=address $(LDFLAGS) -fsanitize=address -static-libasan s_reg.o -o s_reg
s_reg.o: reg.c
$(CC) $(CFLAGS) -fsanitize=address -c reg.c -o s_reg.o
clean :
rm $(PROGRAMS) *.o