mirror of
https://github.com/sockspls/badfish
synced 2025-07-11 19:49:14 +00:00
Avoid wild casting of TBEntry and stale pointers
And reset DTZ_table[i].entry pointers after free to avoid creating stale ones. We really would need something better than plain old C-style pointers, but for now live with that. Obfuscation level here is quite high.... No functional change.
This commit is contained in:
parent
9e53c3296d
commit
8c58963897
2 changed files with 44 additions and 62 deletions
|
@ -7,6 +7,7 @@
|
||||||
a particular engine, provided the engine is written in C or C++.
|
a particular engine, provided the engine is written in C or C++.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <cstring> // For std::memset
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -41,8 +42,6 @@ static TBHashEntry TB_hash[1 << TBHASHBITS][HSHMAX];
|
||||||
static DTZTableEntry DTZ_table[DTZ_ENTRIES];
|
static DTZTableEntry DTZ_table[DTZ_ENTRIES];
|
||||||
|
|
||||||
static uint64_t calc_key_from_pcs(int *pcs, bool mirror);
|
static uint64_t calc_key_from_pcs(int *pcs, bool mirror);
|
||||||
static void free_wdl_entry(TBEntry *entry);
|
|
||||||
static void free_dtz_entry(TBEntry *entry);
|
|
||||||
|
|
||||||
static FD open_tb(const std::string& str, const std::string& suffix)
|
static FD open_tb(const std::string& str, const std::string& suffix)
|
||||||
{
|
{
|
||||||
|
@ -470,17 +469,57 @@ static int binomial[5][64];
|
||||||
static int pawnidx[5][24];
|
static int pawnidx[5][24];
|
||||||
static int pfactor[5][4];
|
static int pfactor[5][4];
|
||||||
|
|
||||||
|
void free_wdl_entry(TBEntry_piece* entry)
|
||||||
|
{
|
||||||
|
unmap_file(entry->data, entry->mapping);
|
||||||
|
|
||||||
|
free(entry->precomp[0]);
|
||||||
|
free(entry->precomp[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_wdl_entry(TBEntry_pawn* entry)
|
||||||
|
{
|
||||||
|
unmap_file(entry->data, entry->mapping);
|
||||||
|
|
||||||
|
for (int f = 0; f < 4; f++)
|
||||||
|
{
|
||||||
|
free(entry->file[f].precomp[0]);
|
||||||
|
free(entry->file[f].precomp[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void free_dtz_entry(TBEntry* entry)
|
||||||
|
{
|
||||||
|
unmap_file(entry->data, entry->mapping);
|
||||||
|
|
||||||
|
if (!entry->has_pawns)
|
||||||
|
free(((DTZEntry_piece*)entry)->precomp);
|
||||||
|
else
|
||||||
|
for (int f = 0; f < 4; f++)
|
||||||
|
free(((DTZEntry_pawn*)entry)->file[f].precomp);
|
||||||
|
|
||||||
|
free(entry);
|
||||||
|
}
|
||||||
|
|
||||||
void Tablebases::init(const std::string& path)
|
void Tablebases::init(const std::string& path)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < TBnum_piece; i++)
|
for (int i = 0; i < TBnum_piece; i++)
|
||||||
free_wdl_entry((TBEntry*)&TB_piece[i]);
|
free_wdl_entry(&TB_piece[i]);
|
||||||
|
|
||||||
for (int i = 0; i < TBnum_pawn; i++)
|
for (int i = 0; i < TBnum_pawn; i++)
|
||||||
free_wdl_entry((TBEntry*)&TB_pawn[i]);
|
free_wdl_entry(&TB_pawn[i]);
|
||||||
|
|
||||||
for (int i = 0; i < DTZ_ENTRIES; i++)
|
for (int i = 0; i < DTZ_ENTRIES; i++)
|
||||||
if (DTZ_table[i].entry)
|
if (DTZ_table[i].entry)
|
||||||
|
{
|
||||||
free_dtz_entry(DTZ_table[i].entry);
|
free_dtz_entry(DTZ_table[i].entry);
|
||||||
|
DTZ_table[i].entry = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
TBnum_piece = TBnum_pawn = 0;
|
||||||
|
MaxCardinality = 0;
|
||||||
|
|
||||||
|
std::memset(TB_hash, 0, sizeof(TB_hash));
|
||||||
|
|
||||||
if (path.empty() || path == "<empty>")
|
if (path.empty() || path == "<empty>")
|
||||||
return;
|
return;
|
||||||
|
@ -522,18 +561,6 @@ void Tablebases::init(const std::string& path)
|
||||||
while (std::getline(ss, token, SEP_CHAR))
|
while (std::getline(ss, token, SEP_CHAR))
|
||||||
paths.push_back(token);
|
paths.push_back(token);
|
||||||
|
|
||||||
TBnum_piece = TBnum_pawn = 0;
|
|
||||||
MaxCardinality = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < (1 << TBHASHBITS); i++)
|
|
||||||
for (int j = 0; j < HSHMAX; j++) {
|
|
||||||
TB_hash[i][j].key = 0;
|
|
||||||
TB_hash[i][j].ptr = nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < DTZ_ENTRIES; i++)
|
|
||||||
DTZ_table[i].entry = nullptr;
|
|
||||||
|
|
||||||
const std::string K("K");
|
const std::string K("K");
|
||||||
|
|
||||||
for (PieceType p1 = PAWN; p1 < KING; ++p1)
|
for (PieceType p1 = PAWN; p1 < KING; ++p1)
|
||||||
|
@ -1405,47 +1432,6 @@ void load_dtz_table(const std::string& str, uint64_t key1, uint64_t key2)
|
||||||
DTZ_table[0].entry = ptr3;
|
DTZ_table[0].entry = ptr3;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void free_wdl_entry(TBEntry *entry)
|
|
||||||
{
|
|
||||||
unmap_file(entry->data, entry->mapping);
|
|
||||||
|
|
||||||
if (!entry->has_pawns) {
|
|
||||||
TBEntry_piece *ptr = (TBEntry_piece *)entry;
|
|
||||||
free(ptr->precomp[0]);
|
|
||||||
|
|
||||||
if (ptr->precomp[1])
|
|
||||||
free(ptr->precomp[1]);
|
|
||||||
} else {
|
|
||||||
TBEntry_pawn *ptr = (TBEntry_pawn *)entry;
|
|
||||||
int f;
|
|
||||||
|
|
||||||
for (f = 0; f < 4; f++) {
|
|
||||||
free(ptr->file[f].precomp[0]);
|
|
||||||
|
|
||||||
if (ptr->file[f].precomp[1])
|
|
||||||
free(ptr->file[f].precomp[1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void free_dtz_entry(TBEntry *entry)
|
|
||||||
{
|
|
||||||
unmap_file(entry->data, entry->mapping);
|
|
||||||
|
|
||||||
if (!entry->has_pawns) {
|
|
||||||
DTZEntry_piece *ptr = (DTZEntry_piece *)entry;
|
|
||||||
free(ptr->precomp);
|
|
||||||
} else {
|
|
||||||
DTZEntry_pawn *ptr = (DTZEntry_pawn *)entry;
|
|
||||||
int f;
|
|
||||||
|
|
||||||
for (f = 0; f < 4; f++)
|
|
||||||
free(ptr->file[f].precomp);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(entry);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int wdl_to_map[5] = { 1, 3, 0, 2, 0 };
|
static int wdl_to_map[5] = { 1, 3, 0, 2, 0 };
|
||||||
static uint8_t pa_flags[5] = { 8, 0, 0, 0, 4 };
|
static uint8_t pa_flags[5] = { 8, 0, 0, 0, 4 };
|
||||||
|
|
||||||
|
|
|
@ -66,11 +66,7 @@ struct TBEntry {
|
||||||
uint8_t num;
|
uint8_t num;
|
||||||
uint8_t symmetric;
|
uint8_t symmetric;
|
||||||
uint8_t has_pawns;
|
uint8_t has_pawns;
|
||||||
}
|
};
|
||||||
#ifndef _WIN32
|
|
||||||
__attribute__((__may_alias__))
|
|
||||||
#endif
|
|
||||||
;
|
|
||||||
|
|
||||||
struct TBEntry_piece {
|
struct TBEntry_piece {
|
||||||
char *data;
|
char *data;
|
||||||
|
|
Loading…
Add table
Reference in a new issue