Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmake/BuildLuzer.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ endif()

ExternalProject_Add(bundled-luzer
GIT_REPOSITORY https://github.com/ligurio/luzer
GIT_TAG 3f4eb03b4ff7596855a0aaf45aa557f61b25ddb2
GIT_TAG fc4a32fe98f1da8b07f74a35f40b678692e7152b
GIT_PROGRESS TRUE
GIT_SHALLOW FALSE
SOURCE_DIR ${LUZER_DIR}/source
Expand Down
2 changes: 1 addition & 1 deletion tests/lapi/builtin_pairs_test.lua
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ local function TestOneInput(buf)
local MAX_N = 1000
local count = fdp:consume_integer(0, MAX_N)
local tbl = fdp:consume_integers(test_lib.MIN_INT, test_lib.MAX_INT, count)
-- Use string keys to activate hash part of the table.
-- Use string keys to activate hash part of the table.
tbl.a = fdp:consume_string(test_lib.MAX_STR_LEN)
tbl.b = fdp:consume_string(test_lib.MAX_STR_LEN)
for key, value in pairs(tbl) do
Expand Down
7 changes: 6 additions & 1 deletion tests/lapi/lib.lua
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,14 @@ local function approx_equal(a, b, epsilon)
return abs(a - b) <= ((abs(a) < abs(b) and abs(b) or abs(a)) * epsilon)
end

local locales

local function random_locale(fdp)
local locales = {}
if locales then
return fdp:oneof(locales)
end
local locale_it = io.popen("locale -a"):read("*a"):gmatch("([^\n]*)\n?")
locales = {}
for locale in locale_it do
table.insert(locales, locale)
end
Expand Down
8 changes: 3 additions & 5 deletions tests/lapi/os_date_test.lua
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,9 @@ local function TestOneInput(buf)
local err_handler = test_lib.err_handler(ignored_msgs)
local ok, res = xpcall(os.date, err_handler, format, time)
if not ok then return end
assert(type(res) == "string" or
type(res) == "table" or
-- Undocumented.
type(res) == "number" or
res == nil)
local type_check = type(res) == "string" or type(res) == "table"
local undocumented_type_check = type(res) == "number" or res == nil
assert(type_check or undocumented_type_check)
end

local args = {
Expand Down
2 changes: 1 addition & 1 deletion tests/lapi/os_setlocale_test.lua
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ local function TestOneInput(buf)
})
local locale_string = os.setlocale(locale, category)
assert(type(locale_string) == "string" or
locale_string == nil)
locale_string == nil)
end

local args = {
Expand Down
8 changes: 3 additions & 5 deletions tests/lapi/os_time_test.lua
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,9 @@ local function TestOneInput(buf)
local err_handler = test_lib.err_handler(ignored_msgs)
local ok, res = xpcall(os.time, err_handler, time)
if not ok then return end
io.stderr:write(type(res) .. "\n")
assert(type(res) == "number" or
type(res) == "table" or
-- Undocumented.
res == nil)
local type_check = type(res) == "number" or type(res) == "table"
local undocumented_type_check = res == nil
assert(type_check or undocumented_type_check)
end

local args = {
Expand Down
22 changes: 10 additions & 12 deletions tests/lapi/string_byte_test.lua
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
--[[
--[=[
SPDX-License-Identifier: ISC
Copyright (c) 2023-2025, Sergey Bronnikov.

Expand All @@ -7,9 +7,9 @@ https://www.lua.org/manual/5.3/manual.html#6.4

string.byte gets confused with some out-of-range negative indices,
https://www.lua.org/bugs.html#5.1.3-9
]]

-- Synopsis: string.byte(s [, i [, j]])
Synopsis: string.byte(s [, i [, j]])
]=]

local luzer = require("luzer")
local test_lib = require("lib")
Expand All @@ -18,17 +18,15 @@ local function TestOneInput(buf, _size)
local fdp = luzer.FuzzedDataProvider(buf)
os.setlocale(test_lib.random_locale(fdp), "all")
local str = fdp:consume_string(test_lib.MAX_STR_LEN)
local i = fdp:consume_integer(0, test_lib.MAX_INT)
local j = fdp:consume_integer(0, test_lib.MAX_INT)
local i = fdp:consume_integer(test_lib.MIN_INT, test_lib.MAX_INT)
local j = fdp:consume_integer(test_lib.MIN_INT, test_lib.MAX_INT)
-- `string.byte()` is the same as `str:byte()`.
assert(string.byte(str, i, j) == str:byte(i, j))
local char_code = string.byte(str, i, j)
if char_code then
assert(type(char_code) == "number")
local byte = string.char(char_code)
assert(byte)
assert(byte == str)
end
-- Note, `string.byte()` returns `nil` when values `i` or `j`
-- are outside the acceptable range (less than zero and
-- greater than the length of the string). It is undocumented.
local bytes = string.char(string.byte(str, i, j))
assert(bytes == string.sub(str, i, j))
end

local args = {
Expand Down
6 changes: 3 additions & 3 deletions tests/lapi/string_rep_test.lua
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ Copyright (c) 2023-2025, Sergey Bronnikov.
6.4 – String Manipulation
https://www.lua.org/manual/5.3/manual.html#6.4

Synopsis: string.rep(s, n [, sep])

read overflow in 'l_strcmp',
https://github.com/lua/lua/commit/f623b969325be736297bc1dff48e763c08778243

Synopsis: string.rep(s, n [, sep])
]]

local luzer = require("luzer")
Expand All @@ -18,7 +18,7 @@ local function TestOneInput(buf, _size)
local fdp = luzer.FuzzedDataProvider(buf)
os.setlocale(test_lib.random_locale(fdp), "all")
-- Huge length leads to slow units.
local n = fdp:consume_integer(0, test_lib.MAX_STR_LEN)
local n = fdp:consume_integer(1, test_lib.MAX_STR_LEN)
local s = fdp:consume_string(test_lib.MAX_STR_LEN)
local sep = fdp:consume_string(test_lib.MAX_STR_LEN)
local len = string.len(string.rep(s, n, sep))
Expand Down
46 changes: 46 additions & 0 deletions tests/lapi/table_clear_test.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
--[[
SPDX-License-Identifier: ISC
Copyright (c) 2023-2025, Sergey Bronnikov.

Double-emitting of IR_NEWREF for the same key on the snap replay,
https://github.com/LuaJIT/LuaJIT/issues/1128

X86/X64 load fusion conflict detection doesn't detect table.clear,
https://github.com/LuaJIT/LuaJIT/issues/1117

Problem of HREFK with table.clear,
https://github.com/LuaJIT/LuaJIT/issues/792

Add support for freeing memory manually,
https://github.com/LuaJIT/LuaJIT/issues/620

Synopsis: table.clear(tbl)
]]

local luzer = require("luzer")
local test_lib = require("lib")

if test_lib.lua_version() ~= "LuaJIT" then
print("Unsupported version.")
os.exit(0)
end

local table_clear = require("table.clear")

local function TestOneInput(buf)
local fdp = luzer.FuzzedDataProvider(buf)
local count = fdp:consume_integer(0, test_lib.MAX_INT64)
local tbl = fdp:consume_strings(test_lib.MAX_STR_LEN, count)
table_clear(tbl)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It would be nice to check that there are no keys in this table after clearing.

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated:

--- a/tests/lapi/table_clear_test.lua                                                                                                   
+++ b/tests/lapi/table_clear_test.lua                                                                                                   
@@ -32,6 +32,12 @@ local function TestOneInput(buf)                                                                                     
     local count = fdp:consume_integer(0, test_lib.MAX_INT64)                                                                           
     local tbl = fdp:consume_strings(test_lib.MAX_STR_LEN, count)                                                                       
     table_clear(tbl)                                                                                                                   
+    -- Make sure the table is empty.                                                                                                   
+    local n_items = 0                                                                                                                  
+    for _, _ in pairs(tbl) do                                                                                                          
+        n_items = n_items + 1                                                                                                          
+    end                                                                                                                                
+    assert(n_items == 0)                                                                                                               
 end                                                                                                                                    
                                                                                                                                        
 local args = {   

Copy link
Collaborator

@Buristan Buristan Aug 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor: s/_, _/_/

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed:

--- a/tests/lapi/table_clear_test.lua
+++ b/tests/lapi/table_clear_test.lua
@@ -34,7 +34,7 @@ local function TestOneInput(buf)
     table_clear(tbl)
     -- Make sure the table is empty.
     local n_items = 0
-    for _, _ in pairs(tbl) do
+    for _ in pairs(tbl) do
         n_items = n_items + 1
     end
     assert(n_items == 0)

-- Make sure the table is empty.
local n_items = 0
for _ in pairs(tbl) do
n_items = n_items + 1
end
assert(n_items == 0)
end

local args = {
artifact_prefix = "table_clear_",
}
luzer.Fuzz(TestOneInput, nil, args)
10 changes: 8 additions & 2 deletions tests/lapi/table_remove_test.lua
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,17 @@ local test_lib = require("lib")

local function TestOneInput(buf, _size)
local fdp = luzer.FuzzedDataProvider(buf)
local count = fdp:consume_integer(0, test_lib.MAX_INT)
local count = fdp:consume_integer(1, test_lib.MAX_INT)
local tbl = fdp:consume_strings(test_lib.MAX_STR_LEN, count)

local indices_count = fdp:consume_integer(0, #tbl)
local indices = fdp:consume_integers(0, count, indices_count)
local min_index = 0
-- PUC Rio Lua 5.2+ raises an error "position out of bounds"
-- when `pos` is equal to 0 and table is not empty.
if test_lib.lua_current_version_ge_than(5, 2) then
min_index = 1
end
local indices = fdp:consume_integers(min_index, count, indices_count)
for _, idx in ipairs(indices) do
local old_v = tbl[idx]
assert(table.remove(tbl, idx) == old_v)
Expand Down