Flawfinder version 2.0.10, (C) 2001-2019 David A. Wheeler. Number of rules (primarily dangerous function names) in C/C++ ruleset: 223 Examining data/dablin-1.13.0/fec/char.h Examining data/dablin-1.13.0/fec/decode_rs.h Examining data/dablin-1.13.0/fec/decode_rs_char.c Examining data/dablin-1.13.0/fec/encode_rs.h Examining data/dablin-1.13.0/fec/encode_rs_char.c Examining data/dablin-1.13.0/fec/fec.h Examining data/dablin-1.13.0/fec/init_rs.h Examining data/dablin-1.13.0/fec/init_rs_char.c Examining data/dablin-1.13.0/fec/rs-common.h Examining data/dablin-1.13.0/fec/test/rs_speedtest.c Examining data/dablin-1.13.0/fec/test/rstest.c Examining data/dablin-1.13.0/src/audio_output.h Examining data/dablin-1.13.0/src/dab_decoder.cpp Examining data/dablin-1.13.0/src/dab_decoder.h Examining data/dablin-1.13.0/src/dablin.cpp Examining data/dablin-1.13.0/src/dablin.h Examining data/dablin-1.13.0/src/dablin_gtk.cpp Examining data/dablin-1.13.0/src/dablin_gtk.h Examining data/dablin-1.13.0/src/dablin_gtk_sls.cpp Examining data/dablin-1.13.0/src/dablin_gtk_sls.h Examining data/dablin-1.13.0/src/dabplus_decoder.cpp Examining data/dablin-1.13.0/src/dabplus_decoder.h Examining data/dablin-1.13.0/src/edi_player.cpp Examining data/dablin-1.13.0/src/edi_player.h Examining data/dablin-1.13.0/src/edi_source.cpp Examining data/dablin-1.13.0/src/edi_source.h Examining data/dablin-1.13.0/src/ensemble_player.cpp Examining data/dablin-1.13.0/src/ensemble_player.h Examining data/dablin-1.13.0/src/ensemble_source.cpp Examining data/dablin-1.13.0/src/ensemble_source.h Examining data/dablin-1.13.0/src/eti_player.cpp Examining data/dablin-1.13.0/src/eti_player.h Examining data/dablin-1.13.0/src/eti_source.cpp Examining data/dablin-1.13.0/src/eti_source.h Examining data/dablin-1.13.0/src/fic_decoder.cpp Examining data/dablin-1.13.0/src/fic_decoder.h Examining data/dablin-1.13.0/src/mot_manager.cpp Examining data/dablin-1.13.0/src/mot_manager.h Examining data/dablin-1.13.0/src/pad_decoder.cpp Examining data/dablin-1.13.0/src/pad_decoder.h Examining data/dablin-1.13.0/src/pcm_output.cpp Examining data/dablin-1.13.0/src/pcm_output.h Examining data/dablin-1.13.0/src/sdl_output.cpp Examining data/dablin-1.13.0/src/sdl_output.h Examining data/dablin-1.13.0/src/subchannel_sink.h Examining data/dablin-1.13.0/src/tools.cpp Examining data/dablin-1.13.0/src/tools.h Examining data/dablin-1.13.0/src/version.cpp Examining data/dablin-1.13.0/src/version.h FINAL RESULTS: data/dablin-1.13.0/src/dablin.cpp:277:2: [4] (format) fprintf: If format strings can be influenced by an attacker, they can be exploited (CWE-134). Use a constant for the format specification. fprintf(stderr, format.c_str(), progress.text.c_str()); data/dablin-1.13.0/src/eti_source.cpp:38:15: [4] (shell) popen: This causes a new program to execute and is difficult to use safely (CWE-78). try using a library call that implements the same functionality if available. input_file = popen(cmdline.c_str(), "r"); data/dablin-1.13.0/src/eti_source.cpp:52:16: [4] (shell) system: This causes a new program to execute and is difficult to use safely (CWE-78). try using a library call that implements the same functionality if available. int result = system(cmd_killall.c_str()); data/dablin-1.13.0/src/tools.cpp:85:2: [4] (format) snprintf: If format strings can be influenced by an attacker, they can be exploited, and note that sprintf variations do not always \0-terminate (CWE-134). Use a constant for the format specification. snprintf(result, sizeof(result), format.c_str(), value); data/dablin-1.13.0/fec/test/rstest.c:39:3: [3] (random) srandom: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. srandom(time(NULL)); data/dablin-1.13.0/fec/test/rstest.c:80:18: [3] (random) random: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. block[i] = random() & nn; data/dablin-1.13.0/fec/test/rstest.c:91:11: [3] (random) random: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. errval = random() & nn; data/dablin-1.13.0/fec/test/rstest.c:95:11: [3] (random) random: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. errloc = random() % nn; data/dablin-1.13.0/fec/test/rstest.c:101:10: [3] (random) random: This function is not sufficiently random for security-related functions such as key and nonce creation (CWE-327). Use a more secure technique for acquiring random values. if(random() & 1) /* 50-50 chance */ data/dablin-1.13.0/src/dablin.cpp:77:13: [3] (buffer) getopt: Some older implementations do not protect against internal buffer overflows (CWE-120, CWE-20). Check implementation on installation, or limit the size of all string inputs. while((c = getopt(argc, argv, "hf:c:l:d:D:g:Gs:x:1puIFr:R:")) != -1) { data/dablin-1.13.0/src/dablin_gtk.cpp:85:13: [3] (buffer) getopt: Some older implementations do not protect against internal buffer overflows (CWE-120, CWE-20). Check implementation on installation, or limit the size of all string inputs. while((c = getopt(argc, argv, "hf:d:D:C:c:l:g:Gr:P:s:x:1puISLF")) != -1) { data/dablin-1.13.0/fec/decode_rs.h:204:7: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(lambda,t,(NROOTS+1)*sizeof(t[0])); data/dablin-1.13.0/fec/decode_rs.h:216:3: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(®[1],&lambda[1],NROOTS*sizeof(reg[0])); data/dablin-1.13.0/fec/test/rs_speedtest.c:10:12: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. unsigned char block[255]; data/dablin-1.13.0/fec/test/rstest.c:54:12: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. unsigned char block[nn],tblock[nn]; data/dablin-1.13.0/fec/test/rstest.c:81:5: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(tblock,block,sizeof(block)); data/dablin-1.13.0/fec/test/rstest.c:85:5: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(tblock,block,sizeof(block)); data/dablin-1.13.0/src/dab_decoder.cpp:188:2: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(&frame[4], body_data, body_bytes); data/dablin-1.13.0/src/dablin_gtk.cpp:651:2: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char cid_string[5]; data/dablin-1.13.0/src/dablin_gtk.cpp:692:3: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char start_string[22]; data/dablin-1.13.0/src/dablin_gtk.cpp:711:24: [2] (misc) fopen: Check when opening files - can an attacker redirect it (via symlinks), force the opening of special file type (e.g., device files), move things around to create a race condition, control its ancestors, or change its contents? (CWE-362). FILE* new_rec_file = fopen(new_rec_filename.c_str(), "wb"); data/dablin-1.13.0/src/dablin_gtk.h:150:3: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(&this->data[0], data, len); data/dablin-1.13.0/src/dabplus_decoder.cpp:76:4: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(sf_raw + i * frame_len, sf_raw + (i + 1) * frame_len, frame_len); data/dablin-1.13.0/src/dabplus_decoder.cpp:82:2: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(sf_raw + (frame_count - 1) * frame_len, data, frame_len); data/dablin-1.13.0/src/dabplus_decoder.cpp:92:2: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(sf, sf_raw, sf_len); data/dablin-1.13.0/src/ensemble_source.cpp:59:16: [2] (misc) fopen: Check when opening files - can an attacker redirect it (via symlinks), force the opening of special file type (e.g., device files), move things around to create a race condition, control its ancestors, or change its contents? (CWE-362). input_file = fopen(filename.c_str(), "rb"); data/dablin-1.13.0/src/fic_decoder.cpp:422:7: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(&sls_ua_data[0], data + offset, ua_data_length); data/dablin-1.13.0/src/fic_decoder.cpp:500:4: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char cid_string[5]; data/dablin-1.13.0/src/fic_decoder.cpp:595:2: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(label.label, data + len_id, 16); data/dablin-1.13.0/src/fic_decoder.cpp:872:2: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char lto_string[7]; data/dablin-1.13.0/src/fic_decoder.cpp:900:2: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char s[11]; data/dablin-1.13.0/src/mot_manager.cpp:32:2: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(&segs[seg_number][0], data, len); data/dablin-1.13.0/src/mot_manager.cpp:54:3: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(&result[offset], &seg[0], seg.size()); data/dablin-1.13.0/src/pad_decoder.cpp:236:2: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(&dg_raw[dg_size], data, copy_len); data/dablin-1.13.0/src/pad_decoder.cpp:340:2: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(dl_seg.prefix, &dg_raw[0], 2); data/dablin-1.13.0/src/pad_decoder.cpp:443:2: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(&result[0], &dg_raw[0], mot_len); data/dablin-1.13.0/src/tools.cpp:47:2: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char digits[3]; data/dablin-1.13.0/src/tools.cpp:84:2: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char result[2 + nibbles + 1]; data/dablin-1.13.0/src/tools.cpp:140:2: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char input_bytes[input_len]; data/dablin-1.13.0/src/tools.cpp:142:2: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(input_bytes, &cleaned_data[0], cleaned_data.size()); data/dablin-1.13.0/src/tools.cpp:146:2: [2] (buffer) char: Statically-sized arrays can be improperly restricted, leading to potential overflows or other issues (CWE-119!/CWE-120). Perform bounds checking, use functions that limit length, or ensure that the size is larger than the maximum possible length. char output_bytes[output_len]; data/dablin-1.13.0/src/tools.cpp:282:3: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(buffer + index_end, data, real_bytes); data/dablin-1.13.0/src/tools.cpp:285:3: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(buffer + index_end, data, first_bytes); data/dablin-1.13.0/src/tools.cpp:286:3: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(buffer, data + first_bytes, real_bytes - first_bytes); data/dablin-1.13.0/src/tools.cpp:300:4: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(data, buffer + index_start, real_bytes); data/dablin-1.13.0/src/tools.cpp:303:4: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(data, buffer + index_start, first_bytes); data/dablin-1.13.0/src/tools.cpp:304:4: [2] (buffer) memcpy: Does not check for buffer overflows when copying to destination (CWE-120). Make sure destination can always hold the source data. memcpy(data + first_bytes, buffer, real_bytes - first_bytes); ANALYSIS SUMMARY: Hits = 47 Lines analyzed = 8937 in approximately 0.28 seconds (32240 lines/second) Physical Source Lines of Code (SLOC) = 5969 Hits@level = [0] 136 [1] 0 [2] 36 [3] 7 [4] 4 [5] 0 Hits@level+ = [0+] 183 [1+] 47 [2+] 47 [3+] 11 [4+] 4 [5+] 0 Hits/KSLOC@level+ = [0+] 30.6584 [1+] 7.87402 [2+] 7.87402 [3+] 1.84285 [4+] 0.670129 [5+] 0 Dot directories skipped = 1 (--followdotdir overrides) Minimum risk level = 1 Not every hit is necessarily a security vulnerability. There may be other security vulnerabilities; review your code! See 'Secure Programming HOWTO' (https://dwheeler.com/secure-programs) for more information.