feat: initial version, incomplete but functional
This commit is contained in:
22
.clang-format
Normal file
22
.clang-format
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
AlignAfterOpenBracket: DontAlign
|
||||||
|
AlignEscapedNewlines: DontAlign
|
||||||
|
AlignOperands: DontAlign
|
||||||
|
AllowShortBlocksOnASingleLine: Always
|
||||||
|
AllowShortCaseLabelsOnASingleLine: true
|
||||||
|
AllowShortEnumsOnASingleLine: true
|
||||||
|
AllowShortIfStatementsOnASingleLine: true
|
||||||
|
AllowShortLoopsOnASingleLine: true
|
||||||
|
AlwaysBreakAfterDefinitionReturnType: TopLevel
|
||||||
|
BreakBeforeTernaryOperators: false
|
||||||
|
BinPackArguments: false
|
||||||
|
BinPackParameters: false
|
||||||
|
BreakBeforeBraces: WebKit
|
||||||
|
IndentCaseLabels: false
|
||||||
|
TabWidth: 4
|
||||||
|
IndentWidth: 4
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
UseTab: ForContinuationAndIndentation
|
||||||
|
ColumnLimit: 0
|
||||||
|
ReflowComments: false
|
||||||
|
SortIncludes: false
|
||||||
|
SpaceBeforeParens: false
|
||||||
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
bin/
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
# ni-leakdetector
|
# ni-leakdetector
|
||||||
|
|
||||||
The Leak Detector of the NI-C system
|
Leak detector of the NI-C system
|
||||||
18
makefile
Normal file
18
makefile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
RELEASE_flags=-DNDEBUG -O2 -g0
|
||||||
|
DEBUG_flags=-std=c23 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -fr bin
|
||||||
|
|
||||||
|
format:
|
||||||
|
clang-format -i test/nileakdetector_test.c
|
||||||
|
clang-format -i nileakdetector.h
|
||||||
|
|
||||||
|
test: bin/test
|
||||||
|
bin/test/nileakdetector_test
|
||||||
|
|
||||||
|
.PHONY: clean format test leaks
|
||||||
|
|
||||||
|
bin/test: test/nileakdetector_test.c
|
||||||
|
mkdir -p bin/test
|
||||||
|
cc ${DEBUG_flags} test/nileakdetector_test.c -o bin/test/nileakdetector_test
|
||||||
56
nileakdetector.h
Normal file
56
nileakdetector.h
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#ifndef NILEAKDETECTOR_VERBOSE
|
||||||
|
#define NILEAKDETECTOR_VERBOSE false
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct _NILeakDetectorData {
|
||||||
|
size_t n_malloc;
|
||||||
|
size_t n_free;
|
||||||
|
} NILeakDetectorData;
|
||||||
|
|
||||||
|
static NILeakDetectorData nileakdetector_data = {
|
||||||
|
.n_malloc = 0,
|
||||||
|
.n_free = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO: calloc, realloc
|
||||||
|
// TODO: pass __FILE__ and __LINE__ so it prints the location of the operations
|
||||||
|
|
||||||
|
void *nileakdetector_malloc(size_t block_size) {
|
||||||
|
void *result = malloc(block_size);
|
||||||
|
if (result == NULL) {
|
||||||
|
if(NILEAKDETECTOR_VERBOSE)
|
||||||
|
printf("[NILeakDetector] Erroneous Allocation (NULL)\n");
|
||||||
|
} else {
|
||||||
|
if(NILEAKDETECTOR_VERBOSE)
|
||||||
|
printf("[NILeakDetector] Allocated %ld Bytes (%p)\n", block_size, result);
|
||||||
|
nileakdetector_data.n_malloc++;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nileakdetector_free(void *block) {
|
||||||
|
free(block);
|
||||||
|
if(NILEAKDETECTOR_VERBOSE)
|
||||||
|
printf("[NILeakDetector] Freed pointer (%p)\n", block);
|
||||||
|
nileakdetector_data.n_free++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nileakdetector_print_summary() {
|
||||||
|
printf("[NILeakDetector] == SUMMARY ==\n");
|
||||||
|
printf("[NILeakDetector] Number of mallocs: %ld\n", nileakdetector_data.n_malloc);
|
||||||
|
printf("[NILeakDetector] Number of frees: %ld\n", nileakdetector_data.n_free);
|
||||||
|
if (nileakdetector_data.n_malloc != nileakdetector_data.n_free) {
|
||||||
|
printf("[NILeakDetector] WARNING: POSSIBLE MEMORY LEAKS\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef malloc
|
||||||
|
#undef free
|
||||||
|
|
||||||
|
#define malloc(sz) nileakdetector_malloc(sz)
|
||||||
|
#define free(p) nileakdetector_free(p)
|
||||||
26
test/nileakdetector_test.c
Normal file
26
test/nileakdetector_test.c
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
|
||||||
|
#define NILEAKDETECTOR_VERBOSE true
|
||||||
|
#include "../nileakdetector.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
test_malloc()
|
||||||
|
{
|
||||||
|
int *x = malloc(sizeof(int));
|
||||||
|
*x = 10;
|
||||||
|
printf("X = %d\n", *x); // Should print the right value of X
|
||||||
|
printf("\nAt this point the summary should indicate leaks...\n");
|
||||||
|
nileakdetector_print_summary();
|
||||||
|
printf("\nAfter this free it should be all good...\n");
|
||||||
|
free(x);
|
||||||
|
nileakdetector_print_summary();
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
test_malloc();
|
||||||
|
printf("== TESTS SUCCESSFUL ==\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user