[olympic,nostalgia] Address unsafe buffer warnings

This commit is contained in:
Gary Talent 2025-05-06 22:25:36 -05:00
parent a8c1387d5a
commit d8195d300d
15 changed files with 55 additions and 42 deletions

View File

@ -238,7 +238,7 @@ uint_t spriteCount(Context &ctx) noexcept;
ox::Error initConsole(Context &ctx) noexcept; ox::Error initConsole(Context &ctx) noexcept;
void puts(Context &ctx, int column, int row, ox::StringViewCR str) noexcept; void consoleWrite(Context &ctx, int column, int row, ox::StringViewCR str) noexcept;
} }

View File

@ -36,13 +36,13 @@ OX_ALLOW_UNSAFE_BUFFERS_END
setBgStatus(*ctx, 0, true); setBgStatus(*ctx, 0, true);
clearBg(*ctx, 0); clearBg(*ctx, 0);
auto const serr = ox::sfmt<ox::IString<23>>("Error code: {}", static_cast<int64_t>(err)); auto const serr = ox::sfmt<ox::IString<23>>("Error code: {}", static_cast<int64_t>(err));
puts(*ctx, 32 + 1, 1, "SADNESS..."); consoleWrite(*ctx, 32 + 1, 1, "SADNESS...");
puts(*ctx, 32 + 1, 4, "UNEXPECTED STATE:"); consoleWrite(*ctx, 32 + 1, 4, "UNEXPECTED STATE:");
puts(*ctx, 32 + 2, 6, panicMsg); consoleWrite(*ctx, 32 + 2, 6, panicMsg);
if (err) { if (err) {
puts(*ctx, 32 + 2, 8, serr); consoleWrite(*ctx, 32 + 2, 8, serr);
} }
puts(*ctx, 32 + 1, 15, "PLEASE RESTART THE SYSTEM"); consoleWrite(*ctx, 32 + 1, 15, "PLEASE RESTART THE SYSTEM");
// print to terminal if in mGBA // print to terminal if in mGBA
oxErrf("\033[31;1;1mPANIC:\033[0m [{}:{}]: {}\n", file, line, panicMsg); oxErrf("\033[31;1;1mPANIC:\033[0m [{}:{}]: {}\n", file, line, panicMsg);
if (err.msg) { if (err.msg) {

View File

@ -251,7 +251,7 @@ ox::Error initConsole(Context &ctx) noexcept {
return loadBgPalette(ctx, 0, PaletteAddr); return loadBgPalette(ctx, 0, PaletteAddr);
} }
void puts( void consoleWrite(
Context &ctx, Context &ctx,
int const column, int const column,
int const row, int const row,

View File

@ -105,13 +105,13 @@ void PaletteEditorImGui::navigateTo(ox::StringViewCR arg) noexcept {
auto const &color = args[0]; auto const &color = args[0];
auto const &page = args[1]; auto const &page = args[1];
{ {
auto const [c, err] = atoi(color); auto const [c, err] = strToInt(color);
if (!err && static_cast<size_t>(c) < colorCnt(m_pal)) { if (!err && static_cast<size_t>(c) < colorCnt(m_pal)) {
m_selectedColorRow = static_cast<size_t>(c); m_selectedColorRow = static_cast<size_t>(c);
} }
} }
{ {
auto const [pg, err] = atoi(page); auto const [pg, err] = strToInt(page);
if (!err && static_cast<size_t>(pg) < m_pal.pages.size()) { if (!err && static_cast<size_t>(pg) < m_pal.pages.size()) {
m_page = static_cast<size_t>(pg); m_page = static_cast<size_t>(pg);
} }

View File

@ -35,8 +35,10 @@ ox::Error gfx::DeleteTilesCommand::redo() noexcept {
auto const src = &p[srcPos]; auto const src = &p[srcPos];
auto const dst1 = &p[m_deletePos]; auto const dst1 = &p[m_deletePos];
auto const dst2 = &p[(p.size() - m_deleteSz)]; auto const dst2 = &p[(p.size() - m_deleteSz)];
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
ox::memmove(dst1, src, p.size() - srcPos); ox::memmove(dst1, src, p.size() - srcPos);
ox::memset(dst2, 0, m_deleteSz * sizeof(decltype(p[0]))); ox::memset(dst2, 0, m_deleteSz * sizeof(decltype(p[0])));
OX_ALLOW_UNSAFE_BUFFERS_END
return {}; return {};
} }
@ -47,8 +49,10 @@ ox::Error DeleteTilesCommand::undo() noexcept {
auto const dst1 = &p[m_deletePos + m_deleteSz]; auto const dst1 = &p[m_deletePos + m_deleteSz];
auto const dst2 = src; auto const dst2 = src;
auto const sz = p.size() - m_deletePos - m_deleteSz; auto const sz = p.size() - m_deletePos - m_deleteSz;
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
ox::memmove(dst1, src, sz); ox::memmove(dst1, src, sz);
ox::memcpy(dst2, m_deletedPixels.data(), m_deletedPixels.size()); ox::memcpy(dst2, m_deletedPixels.data(), m_deletedPixels.size());
OX_ALLOW_UNSAFE_BUFFERS_END
return {}; return {};
} }

View File

@ -27,6 +27,8 @@ InsertTilesCommand::InsertTilesCommand(
} }
} }
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
ox::Error InsertTilesCommand::redo() noexcept { ox::Error InsertTilesCommand::redo() noexcept {
auto &s = getSubSheet(m_img, m_idx); auto &s = getSubSheet(m_img, m_idx);
auto &p = s.pixels; auto &p = s.pixels;
@ -55,6 +57,8 @@ ox::Error InsertTilesCommand::undo() noexcept {
return {}; return {};
} }
OX_ALLOW_UNSAFE_BUFFERS_END
int InsertTilesCommand::commandId() const noexcept { int InsertTilesCommand::commandId() const noexcept {
return static_cast<int>(CommandId::InsertTile); return static_cast<int>(CommandId::InsertTile);
} }

View File

@ -5,12 +5,13 @@
#include <ox/claw/write.hpp> #include <ox/claw/write.hpp>
#include <nostalgia/gfx/consts.hpp> #include <nostalgia/gfx/consts.hpp>
#include <nostalgia/gfx/gfx.hpp>
#include "tilesheetpixelgrid.hpp" #include "tilesheetpixelgrid.hpp"
namespace nostalgia::gfx { namespace nostalgia::gfx {
void TileSheetGrid::setPixelSizeMod(float sm) noexcept { void TileSheetGrid::setPixelSizeMod(float const sm) noexcept {
m_pixelSizeMod = sm; m_pixelSizeMod = sm;
} }
@ -18,10 +19,11 @@ ox::Error TileSheetGrid::buildShader() noexcept {
auto const pixelLineVshad = ox::sfmt(VShad, gl::GlslVersion); auto const pixelLineVshad = ox::sfmt(VShad, gl::GlslVersion);
auto const pixelLineFshad = ox::sfmt(FShad, gl::GlslVersion); auto const pixelLineFshad = ox::sfmt(FShad, gl::GlslVersion);
auto const pixelLineGshad = ox::sfmt(GShad, gl::GlslVersion); auto const pixelLineGshad = ox::sfmt(GShad, gl::GlslVersion);
return glutils::buildShaderProgram(pixelLineVshad, pixelLineFshad, pixelLineGshad).moveTo(m_shader); return glutils::buildShaderProgram(
pixelLineVshad, pixelLineFshad, pixelLineGshad).moveTo(m_shader);
} }
void TileSheetGrid::draw(bool update, ox::Vec2 const&scroll) noexcept { void TileSheetGrid::draw(bool const update, ox::Vec2 const&scroll) noexcept {
// the lines just show up bigger on Windows for some reason // the lines just show up bigger on Windows for some reason
if constexpr(ox::defines::OS == ox::OS::Windows) { if constexpr(ox::defines::OS == ox::OS::Windows) {
glLineWidth(3 * m_pixelSizeMod * 0.25f); glLineWidth(3 * m_pixelSizeMod * 0.25f);
@ -51,7 +53,8 @@ void TileSheetGrid::initBufferSet(ox::Vec2 const&paneSize, TileSheet::SubSheet c
// vbo layout // vbo layout
auto const pt1Attr = static_cast<GLuint>(glGetAttribLocation(m_shader, "vPt1")); auto const pt1Attr = static_cast<GLuint>(glGetAttribLocation(m_shader, "vPt1"));
glEnableVertexAttribArray(pt1Attr); glEnableVertexAttribArray(pt1Attr);
glVertexAttribPointer(pt1Attr, 2, GL_FLOAT, GL_FALSE, VertexVboRowLength * sizeof(float), nullptr); glVertexAttribPointer(
pt1Attr, 2, GL_FLOAT, GL_FALSE, VertexVboRowLength * sizeof(float), nullptr);
auto const pt2Attr = static_cast<GLuint>(glGetAttribLocation(m_shader, "vPt2")); auto const pt2Attr = static_cast<GLuint>(glGetAttribLocation(m_shader, "vPt2"));
glEnableVertexAttribArray(pt2Attr); glEnableVertexAttribArray(pt2Attr);
glVertexAttribPointer(pt2Attr, 2, GL_FLOAT, GL_FALSE, VertexVboRowLength * sizeof(float), glVertexAttribPointer(pt2Attr, 2, GL_FLOAT, GL_FALSE, VertexVboRowLength * sizeof(float),
@ -70,18 +73,18 @@ void TileSheetGrid::update(ox::Vec2 const&paneSize, TileSheet::SubSheet const&su
} }
void TileSheetGrid::setBufferObject( void TileSheetGrid::setBufferObject(
ox::Point pt1, ox::Point const pt1,
ox::Point pt2, ox::Point const pt2,
Color32 c, Color32 const c,
float *vbo, ox::Span<float> const vbo,
ox::Vec2 const&pixSize) noexcept { ox::Vec2 const&pixSize) noexcept {
auto const x1 = static_cast<float>(pt1.x) * pixSize.x - 1.f; auto const x1 = static_cast<float>(pt1.x) * pixSize.x - 1.f;
auto const y1 = 1.f - static_cast<float>(pt1.y) * pixSize.y; auto const y1 = 1.f - static_cast<float>(pt1.y) * pixSize.y;
auto const x2 = static_cast<float>(pt2.x) * pixSize.x - 1.f; auto const x2 = static_cast<float>(pt2.x) * pixSize.x - 1.f;
auto const y2 = 1.f - static_cast<float>(pt2.y) * pixSize.y; auto const y2 = 1.f - static_cast<float>(pt2.y) * pixSize.y;
// don't worry, this memcpy gets optimized to something much more ideal // don't worry, this gets optimized to something much more ideal
ox::Array<float, VertexVboLength> const vertices = {x1, y1, x2, y2, redf(c), greenf(c), bluef(c)}; ox::Array<float, VertexVboLength> const vertices = {x1, y1, x2, y2, redf(c), greenf(c), bluef(c)};
memcpy(vbo, vertices.data(), sizeof(vertices)); ox::spancpy(vbo, ox::SpanView<float>{vertices});
} }
void TileSheetGrid::setBufferObjects(ox::Vec2 const&paneSize, TileSheet::SubSheet const&subsheet) noexcept { void TileSheetGrid::setBufferObjects(ox::Vec2 const&paneSize, TileSheet::SubSheet const&subsheet) noexcept {
@ -92,7 +95,8 @@ void TileSheetGrid::setBufferObjects(ox::Vec2 const&paneSize, TileSheet::SubShee
} }
auto const pixSize = pixelSize(paneSize); auto const pixSize = pixelSize(paneSize);
auto const set = [&](std::size_t i, ox::Point pt1, ox::Point pt2, Color32 c) { auto const set = [&](std::size_t i, ox::Point pt1, ox::Point pt2, Color32 c) {
auto const vbo = &m_bufferSet.vertices[i * VertexVboLength]; auto const idx = i * VertexVboLength;
auto const vbo = ox::Span{m_bufferSet.vertices} + idx;
setBufferObject(pt1, pt2, c, vbo, pixSize); setBufferObject(pt1, pt2, c, vbo, pixSize);
}; };
// set buffer length // set buffer length

View File

@ -7,7 +7,6 @@
#include <glutils/glutils.hpp> #include <glutils/glutils.hpp>
#include <studio/studio.hpp> #include <studio/studio.hpp>
#include <nostalgia/gfx/gfx.hpp>
#include <nostalgia/gfx/tilesheet.hpp> #include <nostalgia/gfx/tilesheet.hpp>
namespace nostalgia::gfx { namespace nostalgia::gfx {
@ -74,7 +73,7 @@ class TileSheetGrid {
void update(ox::Vec2 const&paneSize, TileSheet::SubSheet const&subsheet) noexcept; void update(ox::Vec2 const&paneSize, TileSheet::SubSheet const&subsheet) noexcept;
private: private:
static void setBufferObject(ox::Point pt1, ox::Point pt2, Color32 c, float *vbo, ox::Vec2 const&pixSize) noexcept; static void setBufferObject(ox::Point pt1, ox::Point pt2, Color32 c, ox::Span<float> vbo, ox::Vec2 const&pixSize) noexcept;
void setBufferObjects(ox::Vec2 const&paneSize, TileSheet::SubSheet const&subsheet) noexcept; void setBufferObjects(ox::Vec2 const&paneSize, TileSheet::SubSheet const&subsheet) noexcept;

View File

@ -2,8 +2,6 @@
* Copyright 2016 - 2025 Gary Talent (gary@drinkingtea.net). All rights reserved. * Copyright 2016 - 2025 Gary Talent (gary@drinkingtea.net). All rights reserved.
*/ */
#include <nostalgia/gfx/consts.hpp>
#include <nostalgia/gfx/ptidxconv.hpp>
#include "tilesheeteditormodel.hpp" #include "tilesheeteditormodel.hpp"
#include "tilesheetpixels.hpp" #include "tilesheetpixels.hpp"
@ -88,11 +86,11 @@ ox::Vec2 TileSheetPixels::pixelSize(ox::Vec2 const&paneSize) const noexcept {
void TileSheetPixels::setPixelBufferObject( void TileSheetPixels::setPixelBufferObject(
ox::Vec2 const&paneSize, ox::Vec2 const&paneSize,
unsigned vertexRow, unsigned const vertexRow,
float x, float y, float x, float y,
Color16 color, Color16 const color,
float *vbo, ox::Span<float> const vbo,
GLuint *ebo) const noexcept { ox::Span<GLuint> const ebo) const noexcept {
auto const [xmod, ymod] = pixelSize(paneSize); auto const [xmod, ymod] = pixelSize(paneSize);
x *= xmod; x *= xmod;
y *= -ymod; y *= -ymod;
@ -106,12 +104,12 @@ void TileSheetPixels::setPixelBufferObject(
x + xmod, y + ymod, r, g, b, // top right x + xmod, y + ymod, r, g, b, // top right
x, y + ymod, r, g, b, // top left x, y + ymod, r, g, b, // top left
}; };
memcpy(vbo, vertices.data(), sizeof(vertices)); ox::spancpy(vbo, ox::SpanView<float>{vertices});
std::array const elms = { std::array const elms = {
vertexRow + 0, vertexRow + 1, vertexRow + 2, vertexRow + 0, vertexRow + 1, vertexRow + 2,
vertexRow + 2, vertexRow + 3, vertexRow + 0, vertexRow + 2, vertexRow + 3, vertexRow + 0,
}; };
memcpy(ebo, elms.data(), sizeof(elms)); ox::spancpy(ebo, ox::SpanView<GLuint>{elms});
} }
void TileSheetPixels::setBufferObjects(ox::Vec2 const&paneSize) noexcept { void TileSheetPixels::setBufferObjects(ox::Vec2 const&paneSize) noexcept {
@ -137,8 +135,8 @@ void TileSheetPixels::setBufferObjects(ox::Vec2 const&paneSize) noexcept {
auto const pt = idxToPt(static_cast<int>(i), subSheet.columns); auto const pt = idxToPt(static_cast<int>(i), subSheet.columns);
auto const fx = static_cast<float>(pt.x); auto const fx = static_cast<float>(pt.x);
auto const fy = static_cast<float>(pt.y); auto const fy = static_cast<float>(pt.y);
auto const vbo = &m_bufferSet.vertices[i * vboLen]; auto const vbo = ox::Span{m_bufferSet.vertices} + i * vboLen;
auto const ebo = &m_bufferSet.elements[i * VertexEboLength]; auto const ebo = ox::Span{m_bufferSet.elements} + i * VertexEboLength;
if (i * vboLen + vboLen > m_bufferSet.vertices.size()) { if (i * vboLen + vboLen > m_bufferSet.vertices.size()) {
return; return;
} }

View File

@ -6,11 +6,9 @@
#include <ox/std/vec.hpp> #include <ox/std/vec.hpp>
#include <glutils/glutils.hpp>
#include <studio/studio.hpp>
#include <nostalgia/gfx/color.hpp> #include <nostalgia/gfx/color.hpp>
#include <nostalgia/gfx/gfx.hpp>
#include <glutils/glutils.hpp>
namespace nostalgia::gfx { namespace nostalgia::gfx {
@ -44,15 +42,15 @@ class TileSheetPixels {
private: private:
void setPixelBufferObject( void setPixelBufferObject(
ox::Vec2 const&paneS, ox::Vec2 const&paneSize,
unsigned vertexRow, unsigned vertexRow,
float x, float x,
float y, float y,
Color16 color, Color16 color,
float *vbo, ox::Span<float> vbo,
GLuint *ebo) const noexcept; ox::Span<GLuint> ebo) const noexcept;
void setBufferObjects(ox::Vec2 const&paneS) noexcept; void setBufferObjects(ox::Vec2 const&paneSize) noexcept;
}; };

View File

@ -69,7 +69,7 @@ static ox::Error runTest(turbine::Context &tctx) {
OX_RETURN_ERROR(gfx::loadSpriteTileSheet(*cctx, "/TileSheets/Charset.nts")); OX_RETURN_ERROR(gfx::loadSpriteTileSheet(*cctx, "/TileSheets/Charset.nts"));
OX_RETURN_ERROR(gfx::loadSpritePalette(*cctx, "/Palettes/Chester.npal")); OX_RETURN_ERROR(gfx::loadSpritePalette(*cctx, "/Palettes/Chester.npal"));
OX_RETURN_ERROR(gfx::initConsole(*cctx)); OX_RETURN_ERROR(gfx::initConsole(*cctx));
gfx::puts(*cctx, 10, 9, "DOPENESS!!!"); gfx::consoleWrite(*cctx, 10, 9, "DOPENESS!!!");
turbine::setUpdateHandler(tctx, testUpdateHandler); turbine::setUpdateHandler(tctx, testUpdateHandler);
turbine::setKeyEventHandler(tctx, testKeyEventHandler); turbine::setKeyEventHandler(tctx, testKeyEventHandler);
return turbine::run(tctx); return turbine::run(tctx);

View File

@ -12,10 +12,12 @@
namespace studio { namespace studio {
FDFilterItem::FDFilterItem(ox::StringViewCR pName, ox::StringViewCR pSpec) noexcept { FDFilterItem::FDFilterItem(ox::StringViewCR pName, ox::StringViewCR pSpec) noexcept {
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
name.resize(pName.len() + 1); name.resize(pName.len() + 1);
ox::strncpy(name.data(), pName.data(), pName.len()); ox::strncpy(name.data(), pName.data(), pName.len());
spec.resize(pSpec.len() + 1); spec.resize(pSpec.len() + 1);
ox::strncpy(spec.data(), pSpec.data(), pSpec.len()); ox::strncpy(spec.data(), pSpec.data(), pSpec.len());
OX_ALLOW_UNSAFE_BUFFERS_END
} }
static ox::Result<ox::String> toResult(nfdresult_t r, NFD::UniquePathN const&path) noexcept { static ox::Result<ox::String> toResult(nfdresult_t r, NFD::UniquePathN const&path) noexcept {

View File

@ -44,10 +44,10 @@ static ox::Result<std::size_t> findPreloadSection() noexcept {
// media section // media section
constexpr auto headerP2 = "DER_____________"; constexpr auto headerP2 = "DER_____________";
constexpr auto headerP1 = "KEEL_PRELOAD_HEA"; constexpr auto headerP1 = "KEEL_PRELOAD_HEA";
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
constexpr auto headerP1Len = ox::strlen(headerP2); constexpr auto headerP1Len = ox::strlen(headerP2);
constexpr auto headerP2Len = ox::strlen(headerP1); constexpr auto headerP2Len = ox::strlen(headerP1);
constexpr auto headerLen = headerP1Len + headerP2Len; constexpr auto headerLen = headerP1Len + headerP2Len;
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
for (auto current = MEM_ROM; current < reinterpret_cast<char*>(0x0a000000); current += headerLen) { for (auto current = MEM_ROM; current < reinterpret_cast<char*>(0x0a000000); current += headerLen) {
if (memcmp(current, headerP1, headerP1Len) == 0 && if (memcmp(current, headerP1, headerP1Len) == 0 &&
memcmp(current + headerP1Len, headerP2, headerP2Len) == 0) { memcmp(current + headerP1Len, headerP2, headerP2Len) == 0) {

View File

@ -18,7 +18,9 @@ ox::String getClipboardText(Context &ctx) noexcept {
void setClipboardText(Context &ctx, ox::StringViewCR text) noexcept { void setClipboardText(Context &ctx, ox::StringViewCR text) noexcept {
auto cstr = ox_malloca(text.bytes() + 1, char); auto cstr = ox_malloca(text.bytes() + 1, char);
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
ox::strncpy(cstr.get(), text.data(), text.bytes()); ox::strncpy(cstr.get(), text.data(), text.bytes());
OX_ALLOW_UNSAFE_BUFFERS_END
glfwSetClipboardString(ctx.window, cstr.get()); glfwSetClipboardString(ctx.window, cstr.get());
} }

View File

@ -267,7 +267,9 @@ ox::Error setWindowIcon(Context &ctx, ox::SpanView<ox::SpanView<uint8_t>> const
void setWindowTitle(Context &ctx, ox::StringViewCR title) noexcept { void setWindowTitle(Context &ctx, ox::StringViewCR title) noexcept {
auto cstr = ox_malloca(title.bytes() + 1, char); auto cstr = ox_malloca(title.bytes() + 1, char);
OX_ALLOW_UNSAFE_BUFFERS_BEGIN
ox::strncpy(cstr.get(), title.data(), title.bytes()); ox::strncpy(cstr.get(), title.data(), title.bytes());
OX_ALLOW_UNSAFE_BUFFERS_END
glfwSetWindowTitle(ctx.window, cstr.get()); glfwSetWindowTitle(ctx.window, cstr.get());
} }