summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Estelami <NEstelami@users.noreply.github.com>2023-05-01 22:58:20 -0400
committerGitHub <noreply@github.com>2023-05-01 22:58:20 -0400
commitfcfa28901e91d756ad22f05e6827d7646e484061 (patch)
tree70c3fe8e99b5ff52921a3e3b56d8815f5a10da34
parent53e140e8419f9c067de22949bcea45ede750bf75 (diff)
Warn hardcoded pointers (Merge Conflict Fix) (#288)
* Warn on hardcoded pointers * Fix a bunch of false positives * Move warning to a more common place * Add -Whardcoded-generic-pointer * format --------- Co-authored-by: angie <angheloalf95@gmail.com>
-rw-r--r--README.md33
-rw-r--r--ZAPD/Globals.cpp40
-rw-r--r--ZAPD/Globals.h10
-rw-r--r--ZAPD/WarningHandler.cpp34
-rw-r--r--ZAPD/WarningHandler.h1
-rw-r--r--ZAPD/ZDisplayList.cpp63
-rw-r--r--ZAPD/ZLimb.cpp2
-rw-r--r--ZAPD/ZPath.cpp4
8 files changed, 125 insertions, 62 deletions
diff --git a/README.md b/README.md
index bb96bab..e2d1f64 100644
--- a/README.md
+++ b/README.md
@@ -139,22 +139,23 @@ Each warning type uses one of these by default, but can be modified with flags,
All warning types currently implemented, with their default levels:
-| Warning type | Default level | Description |
-| --------------------------- | ------------- | ------------------------------------------------------------------------ |
-| `-Wdeprecated` | Warn | Deprecated features |
-| `-Whardcoded-pointer` | Warn | ZAPD lacks the info to make a symbol, so must output a hardcoded pointer |
-| `-Wintersection` | Warn | Two assets intersect |
-| `-Winvalid-attribute-value` | Err | Attribute declared in XML is wrong |
-| `-Winvalid-extracted-data` | Err | Extracted data does not have correct form |
-| `-Winvalid-jpeg` | Err | JPEG file does not conform to the game's format requirements |
-| `-Winvalid-png` | Err | Issues arising when processing PNG data |
-| `-Winvalid-xml` | Err | XML has syntax errors |
-| `-Wmissing-attribute` | Warn | Required attribute missing in XML tag |
-| `-Wmissing-offsets` | Warn | Offset attribute missing in XML tag |
-| `-Wmissing-segment` | Warn | Segment not given in File tag in XML |
-| `-Wnot-implemented` | Warn | ZAPD does not currently support this feature |
-| `-Wunaccounted` | Off | Large blocks of unaccounted |
-| `-Wunknown-attribute` | Warn | Unknown attribute in XML entry tag |
+| Warning type | Default level | Description |
+| ----------------------------- | ------------- | ------------------------------------------------------------------------ |
+| `-Wdeprecated` | Warn | Deprecated features |
+| `-Whardcoded-generic-pointer` | Off | A generic segmented pointer must be produced |
+| `-Whardcoded-pointer` | Warn | ZAPD lacks the info to make a symbol, so must output a hardcoded pointer |
+| `-Wintersection` | Warn | Two assets intersect |
+| `-Winvalid-attribute-value` | Err | Attribute declared in XML is wrong |
+| `-Winvalid-extracted-data` | Err | Extracted data does not have correct form |
+| `-Winvalid-jpeg` | Err | JPEG file does not conform to the game's format requirements |
+| `-Winvalid-png` | Err | Issues arising when processing PNG data |
+| `-Winvalid-xml` | Err | XML has syntax errors |
+| `-Wmissing-attribute` | Warn | Required attribute missing in XML tag |
+| `-Wmissing-offsets` | Warn | Offset attribute missing in XML tag |
+| `-Wmissing-segment` | Warn | Segment not given in File tag in XML |
+| `-Wnot-implemented` | Warn | ZAPD does not currently support this feature |
+| `-Wunaccounted` | Off | Large blocks of unaccounted |
+| `-Wunknown-attribute` | Warn | Unknown attribute in XML entry tag |
There are also errors that do not have a type, and cannot be disabled.
diff --git a/ZAPD/Globals.cpp b/ZAPD/Globals.cpp
index a10705e..02380f6 100644
--- a/ZAPD/Globals.cpp
+++ b/ZAPD/Globals.cpp
@@ -83,9 +83,10 @@ ExporterSet* Globals::GetExporterSet()
}
bool Globals::GetSegmentedPtrName(segptr_t segAddress, ZFile* currentFile,
- const std::string& expectedType, std::string& declName)
+ const std::string& expectedType, std::string& declName,
+ bool warnIfNotFound)
{
- if (segAddress == 0)
+ if (segAddress == SEGMENTED_NULL)
{
declName = "NULL";
return true;
@@ -160,14 +161,18 @@ bool Globals::GetSegmentedPtrName(segptr_t segAddress, ZFile* currentFile,
}
declName = StringHelper::Sprintf("0x%08X", segAddress);
+ if (warnIfNotFound)
+ {
+ WarnHardcodedPointer(segAddress, currentFile, nullptr, -1);
+ }
return false;
}
bool Globals::GetSegmentedArrayIndexedName(segptr_t segAddress, size_t elementSize,
ZFile* currentFile, const std::string& expectedType,
- std::string& declName)
+ std::string& declName, bool warnIfNotFound)
{
- if (segAddress == 0)
+ if (segAddress == SEGMENTED_NULL)
{
declName = "NULL";
return true;
@@ -197,9 +202,36 @@ bool Globals::GetSegmentedArrayIndexedName(segptr_t segAddress, size_t elementSi
}
declName = StringHelper::Sprintf("0x%08X", segAddress);
+ if (warnIfNotFound)
+ {
+ WarnHardcodedPointer(segAddress, currentFile, nullptr, -1);
+ }
return false;
}
+void Globals::WarnHardcodedPointer(segptr_t segAddress, ZFile* currentFile, ZResource* res,
+ offset_t currentOffset)
+{
+ uint8_t segment = GETSEGNUM(segAddress);
+
+ if ((segment >= 2 && segment <= 6) || segment == 0x80)
+ {
+ std::string errorHeader = "A hardcoded pointer was found";
+ std::string errorBody = StringHelper::Sprintf("Pointer: 0x%08X", segAddress);
+
+ HANDLE_WARNING_RESOURCE(WarningType::HardcodedPointer, currentFile, res, currentOffset,
+ errorHeader, errorBody);
+ }
+ else
+ {
+ std::string errorHeader = "A general purpose hardcoded pointer was found";
+ std::string errorBody = StringHelper::Sprintf("Pointer: 0x%08X", segAddress);
+
+ HANDLE_WARNING_RESOURCE(WarningType::HardcodedGenericPointer, currentFile, res,
+ currentOffset, errorHeader, errorBody);
+ }
+}
+
ExternalFile::ExternalFile(fs::path nXmlPath, fs::path nOutPath)
: xmlPath{nXmlPath}, outPath{nOutPath}
{
diff --git a/ZAPD/Globals.h b/ZAPD/Globals.h
index 1ae753e..4ea2cde 100644
--- a/ZAPD/Globals.h
+++ b/ZAPD/Globals.h
@@ -86,8 +86,14 @@ public:
* in which case `declName` will be set to the address formatted as a pointer.
*/
bool GetSegmentedPtrName(segptr_t segAddress, ZFile* currentFile,
- const std::string& expectedType, std::string& declName);
+ const std::string& expectedType, std::string& declName,
+ bool warnIfNotFound = true);
bool GetSegmentedArrayIndexedName(segptr_t segAddress, size_t elementSize, ZFile* currentFile,
- const std::string& expectedType, std::string& declName);
+ const std::string& expectedType, std::string& declName,
+ bool warnIfNotFound = true);
+
+ // TODO: consider moving to another place
+ void WarnHardcodedPointer(segptr_t segAddress, ZFile* currentFile, ZResource* res,
+ offset_t currentOffset);
};
diff --git a/ZAPD/WarningHandler.cpp b/ZAPD/WarningHandler.cpp
index 163b028..f416a5b 100644
--- a/ZAPD/WarningHandler.cpp
+++ b/ZAPD/WarningHandler.cpp
@@ -84,26 +84,27 @@ typedef struct
*/
// clang-format off
static const std::unordered_map<std::string, WarningInfoInit> warningStringToInitMap = {
- {"deprecated", {WarningType::Deprecated,
+ {"deprecated", {WarningType::Deprecated,
#ifdef DEPRECATION_ON
WarningLevel::Warn,
#else
WarningLevel::Off,
#endif
"Deprecated features"}},
- {"unaccounted", {WarningType::Unaccounted, WarningLevel::Off, "Large blocks of unaccounted"}},
- {"missing-offsets", {WarningType::MissingOffsets, WarningLevel::Warn, "Offset attribute missing in XML tag"}},
- {"intersection", {WarningType::Intersection, WarningLevel::Warn, "Two assets intersect"}},
- {"missing-attribute", {WarningType::MissingAttribute, WarningLevel::Warn, "Required attribute missing in XML tag"}},
- {"invalid-attribute-value", {WarningType::InvalidAttributeValue, WarningLevel::Err, "Attribute declared in XML is wrong"}},
- {"unknown-attribute", {WarningType::UnknownAttribute, WarningLevel::Warn, "Unknown attribute in XML entry tag"}},
- {"invalid-xml", {WarningType::InvalidXML, WarningLevel::Err, "XML has syntax errors"}},
- {"invalid-jpeg", {WarningType::InvalidJPEG, WarningLevel::Err, "JPEG file does not conform to the game's format requirements"}},
- {"invalid-png", {WarningType::InvalidPNG, WarningLevel::Err, "Issues arising when processing PNG data"}},
- {"invalid-extracted-data", {WarningType::InvalidExtractedData, WarningLevel::Err, "Extracted data does not have correct form"}},
- {"missing-segment", {WarningType::MissingSegment, WarningLevel::Warn, "Segment not given in File tag in XML"}},
- {"hardcoded-pointer", {WarningType::HardcodedPointer, WarningLevel::Warn, "ZAPD lacks the info to make a symbol, so must output a hardcoded pointer"}},
- {"not-implemented", {WarningType::NotImplemented, WarningLevel::Warn, "ZAPD does not currently support this feature"}},
+ {"unaccounted", {WarningType::Unaccounted, WarningLevel::Off, "Large blocks of unaccounted"}},
+ {"missing-offsets", {WarningType::MissingOffsets, WarningLevel::Warn, "Offset attribute missing in XML tag"}},
+ {"intersection", {WarningType::Intersection, WarningLevel::Warn, "Two assets intersect"}},
+ {"missing-attribute", {WarningType::MissingAttribute, WarningLevel::Warn, "Required attribute missing in XML tag"}},
+ {"invalid-attribute-value", {WarningType::InvalidAttributeValue, WarningLevel::Err, "Attribute declared in XML is wrong"}},
+ {"unknown-attribute", {WarningType::UnknownAttribute, WarningLevel::Warn, "Unknown attribute in XML entry tag"}},
+ {"invalid-xml", {WarningType::InvalidXML, WarningLevel::Err, "XML has syntax errors"}},
+ {"invalid-jpeg", {WarningType::InvalidJPEG, WarningLevel::Err, "JPEG file does not conform to the game's format requirements"}},
+ {"invalid-png", {WarningType::InvalidPNG, WarningLevel::Err, "Issues arising when processing PNG data"}},
+ {"invalid-extracted-data", {WarningType::InvalidExtractedData, WarningLevel::Err, "Extracted data does not have correct form"}},
+ {"missing-segment", {WarningType::MissingSegment, WarningLevel::Warn, "Segment not given in File tag in XML"}},
+ {"hardcoded-generic-pointer", {WarningType::HardcodedGenericPointer, WarningLevel::Off, "A generic segmented pointer must be produced"}},
+ {"hardcoded-pointer", {WarningType::HardcodedPointer, WarningLevel::Warn, "ZAPD lacks the info to make a symbol, so must output a hardcoded pointer"}},
+ {"not-implemented", {WarningType::NotImplemented, WarningLevel::Warn, "ZAPD does not currently support this feature"}},
};
/**
@@ -229,7 +230,10 @@ void WarningHandler::ExtractedFilePreamble(const ZFile *parent, const ZResource*
if (res != nullptr) {
fprintf(stderr, "resource '%s' at ", res->GetName().c_str());
}
- fprintf(stderr, "offset 0x%06X: \n\t", offset);
+ if (offset != static_cast<uint32_t>(-1)) {
+ fprintf(stderr, "offset 0x%06X:", offset);
+ }
+ fprintf(stderr, "\n\t");
}
/**
diff --git a/ZAPD/WarningHandler.h b/ZAPD/WarningHandler.h
index bb0360a..f993300 100644
--- a/ZAPD/WarningHandler.h
+++ b/ZAPD/WarningHandler.h
@@ -81,6 +81,7 @@ enum class WarningType
InvalidExtractedData,
MissingSegment,
HardcodedPointer,
+ HardcodedGenericPointer,
NotImplemented,
Max,
};
diff --git a/ZAPD/ZDisplayList.cpp b/ZAPD/ZDisplayList.cpp
index a070ac5..27bd966 100644
--- a/ZAPD/ZDisplayList.cpp
+++ b/ZAPD/ZDisplayList.cpp
@@ -1713,17 +1713,26 @@ static int32_t GfxdCallback_DisplayList(uint32_t seg)
uint32_t dListSegNum = GETSEGNUM(seg);
std::string dListName = "";
- bool addressFound = Globals::Instance->GetSegmentedPtrName(seg, self->parent, "Gfx", dListName);
+ bool addressFound =
+ Globals::Instance->GetSegmentedPtrName(seg, self->parent, "Gfx", dListName, false);
- if (!addressFound && self->parent->segment == dListSegNum)
+ if (!addressFound)
{
- ZDisplayList* newDList = new ZDisplayList(self->parent);
- newDList->ExtractFromBinary(
- dListOffset,
- self->GetDListLength(self->parent->GetRawData(), dListOffset, self->dListType));
- newDList->SetName(newDList->GetDefaultName(self->parent->GetName()));
- self->otherDLists.push_back(newDList);
- dListName = newDList->GetName();
+ if (self->parent->segment == dListSegNum)
+ {
+ ZDisplayList* newDList = new ZDisplayList(self->parent);
+ newDList->ExtractFromBinary(
+ dListOffset,
+ self->GetDListLength(self->parent->GetRawData(), dListOffset, self->dListType));
+ newDList->SetName(newDList->GetDefaultName(self->parent->GetName()));
+ self->otherDLists.push_back(newDList);
+ dListName = newDList->GetName();
+ }
+ else
+ {
+ Globals::Instance->WarnHardcodedPointer(seg, self->parent, self,
+ self->GetRawDataIndex());
+ }
}
gfxd_puts(dListName.c_str());
@@ -1736,21 +1745,31 @@ static int32_t GfxdCallback_Matrix(uint32_t seg)
std::string mtxName;
ZDisplayList* self = static_cast<ZDisplayList*>(gfxd_udata_get());
- bool addressFound = Globals::Instance->GetSegmentedPtrName(seg, self->parent, "Mtx", mtxName);
- if (!addressFound && GETSEGNUM(seg) == self->parent->segment)
+ bool addressFound =
+ Globals::Instance->GetSegmentedPtrName(seg, self->parent, "Mtx", mtxName, false);
+
+ if (!addressFound)
{
- Declaration* decl =
- self->parent->GetDeclaration(Seg2Filespace(seg, self->parent->baseAddress));
- if (decl == nullptr)
+ if (GETSEGNUM(seg) == self->parent->segment)
+ {
+ Declaration* decl =
+ self->parent->GetDeclaration(Seg2Filespace(seg, self->parent->baseAddress));
+ if (decl == nullptr)
+ {
+ ZMtx mtx(self->parent);
+ mtx.SetName(mtx.GetDefaultName(self->GetName()));
+ mtx.ExtractFromFile(Seg2Filespace(seg, self->parent->baseAddress));
+ mtx.DeclareVar(self->GetName(), "");
+
+ mtx.GetSourceOutputCode(self->GetName());
+ self->mtxList.push_back(mtx);
+ mtxName = "&" + mtx.GetName();
+ }
+ }
+ else
{
- ZMtx mtx(self->parent);
- mtx.SetName(mtx.GetDefaultName(self->GetName()));
- mtx.ExtractFromFile(Seg2Filespace(seg, self->parent->baseAddress));
- mtx.DeclareVar(self->GetName(), "");
-
- mtx.GetSourceOutputCode(self->GetName());
- self->mtxList.push_back(mtx);
- mtxName = "&" + mtx.GetName();
+ Globals::Instance->WarnHardcodedPointer(seg, self->parent, self,
+ self->GetRawDataIndex());
}
}
diff --git a/ZAPD/ZLimb.cpp b/ZAPD/ZLimb.cpp
index 034d085..fd824d0 100644
--- a/ZAPD/ZLimb.cpp
+++ b/ZAPD/ZLimb.cpp
@@ -394,7 +394,7 @@ void ZLimb::DeclareDList(segptr_t dListSegmentedPtr, const std::string& prefix,
std::string dlistName;
bool declFound = Globals::Instance->GetSegmentedArrayIndexedName(dListSegmentedPtr, 8, parent,
- "Gfx", dlistName);
+ "Gfx", dlistName, false);
if (declFound)
return;
diff --git a/ZAPD/ZPath.cpp b/ZAPD/ZPath.cpp
index ae50f8a..0852ece 100644
--- a/ZAPD/ZPath.cpp
+++ b/ZAPD/ZPath.cpp
@@ -145,8 +145,8 @@ void PathwayEntry::DeclareReferences(const std::string& prefix)
return;
std::string pointsName;
- bool addressFound =
- Globals::Instance->GetSegmentedPtrName(listSegmentAddress, parent, "Vec3s", pointsName);
+ bool addressFound = Globals::Instance->GetSegmentedPtrName(listSegmentAddress, parent, "Vec3s",
+ pointsName, false);
if (addressFound)
return;