éçã³ãŒãåæã¯ããããžã§ã¯ãã«å€æŽãå ãããšãã«æã广çã§ãããã°ã¯ããã°ãåææ®µéã§çºçããã®ãé²ãããããå°æ¥ä¿®æ£ããã®ãåžžã«é£ããããã§ããç¶ç¶çãªéçºã·ã¹ãã ã§PVS-Studioã䜿çšããããã®ãªãã·ã§ã³ãåŒãç¶ãæ¡åŒµããMinetestã²ãŒã ã®äŸã䜿çšããŠãMicrosoft AzureDevOpsã§ã»ã«ããã¹ããšãŒãžã§ã³ãã䜿çšããŠãã«ãªã¯ãšã¹ãã®åæãèšå®ããæ¹æ³ã瀺ããŸãã
ç§ãã¡ãæ±ã£ãŠããããšã«ã€ããŠç°¡åã«
Minetestã¯ãçŽ200,000è¡ã®CãC ++ãããã³Luaã³ãŒããå«ããªãŒãã³ãœãŒã¹ã®ã¯ãã¹ãã©ãããã©ãŒã ã²ãŒã ãšã³ãžã³ã§ããããã«ããããã¯ã»ã«ç©ºéã§ããŸããŸãªã²ãŒã ã¢ãŒããäœæã§ããŸãããã«ããã¬ã€ã€ãŒãããã³å€ãã®ã³ãã¥ããã£modããµããŒãããŸãããããžã§ã¯ããªããžããªã¯ããã§ãã¹ããããŠããŸãïŒhttpsïŒ//github.com/minetest/minetestã
次ã®ããŒã«ã䜿çšããŠãéåžžã®ãšã©ãŒæ€çŽ¢ãèšå®ããŸãã
ãPVS-Studioã¯ãCãC ++ãCïŒãããã³Javaã®éçã³ãŒãã¢ãã©ã€ã¶ãŒã§ããããšã©ãŒãšã»ãã¥ãªãã£äžã®æ¬ é¥ãæ€åºããŸãã
Azure DevOpsã¯ãã¢ããªã±ãŒã·ã§ã³ãéçºãå®è¡ãããªã¢ãŒããµãŒããŒã«ããŒã¿ãä¿åããæ©èœãæäŸããã¯ã©ãŠãããŒã¹ã®ãã©ãããã©ãŒã ã§ãã
Windowsããã³Linuxä»®æ³ãã·ã³ã䜿çšããŠãAzureã§éçºã¿ã¹ã¯ãå®è¡ã§ããŸãããã ããããŒã«ã«ããŒããŠã§ã¢ã§ãšãŒãžã§ã³ããå®è¡ããããšã«ã¯ãããã€ãã®éèŠãªå©ç¹ããããŸãã
- Localhostã¯ãAzureVMãããå€ãã®ãªãœãŒã¹ãæã€ããšãã§ããŸãã
- ãšãŒãžã§ã³ãã¯ãã¿ã¹ã¯ã®å®äºåŸã«ãæ¶ãããããšã¯ãããŸããã
- ç°å¢ãçŽæ¥ã«ã¹ã¿ãã€ãºããæ©èœãããã³ãã«ãããã»ã¹ã®ããæè»ãªå¶åŸ¡ã
- äžéãã¡ã€ã«ãããŒã«ã«ã«ä¿åãããšããã«ãé床ã«ãã©ã¹ã®å¹æããããŸãã
- æã«30以äžã®ã¿ã¹ã¯ãç¡æã§å®äºããããšãã§ããŸãã
ã»ã«ããã¹ããšãŒãžã§ã³ãã䜿çšããããã®æºå
Azureã®äœ¿çšãéå§ããããã»ã¹ã«ã€ããŠã¯ããPVS-Studioãã¯ã©ãŠãã«ç§»è¡ããïŒAzure DevOpsãã®èšäºã§è©³ãã説æãããŠãããããã»ã«ããã¹ããšãŒãžã§ã³ãã®äœæã«çŽæ¥é²ã¿ãŸãã
ãšãŒãžã§ã³ãããããžã§ã¯ãããŒã«ã«æ¥ç¶ããæš©å©ãæã€ããã«ã¯ãç¹å¥ãªã¢ã¯ã»ã¹ããŒã¯ã³ãå¿ èŠã§ããããã¯ã[å人ã¢ã¯ã»ã¹ããŒã¯ã³]ããŒãžã®[ãŠãŒã¶ãŒèšå®]ã¡ãã¥ãŒããååŸã§ããŸãã

[æ°ããããŒã¯ã³]ãã¯ãªãã¯ããåŸãååãæå®ãã[ãšãŒãžã§ã³ãããŒã«ã®èªã¿åããšç®¡ç]ãéžæããå¿ èŠããããŸãïŒ[ãã¹ãŠã®ã¹ã³ãŒãã衚瀺]ã§ãªã¹ãå šäœãå±éããå¿ èŠãããå ŽåããããŸãïŒã

Azureã¯ããŒã¯ã³ã衚瀺ããªããªããããããŒã¯ã³ãã³ããŒããå¿ èŠããããæ°ããããŒã¯ã³ãäœæããå¿ èŠããããŸãã

Windows ServerCoreã«åºã¥ãDockerã³ã³ããããšãŒãžã§ã³ããšããŠäœ¿çšãããŸãããã¹ãã¯ãHyper-VãæèŒããWindows 10x64äžã®ç§ã®ä»äºçšã³ã³ãã¥ãŒã¿ãŒã§ãã
ãŸããDockerã³ã³ããã§äœ¿çšã§ãããã£ã¹ã¯é åã®éãæ¡åŒµããå¿ èŠããããŸãã
Windowsã§ã¯ããã®ããã«ãã¡ã€ã« 'CïŒ\ ProgramData \ Docker \ config \ daemon.json'ãæ¬¡ã®ããã«å€æŽããå¿ èŠããããŸãã
{
"registry-mirrors": [],
"insecure-registries": [],
"debug": true,
"experimental": false,
"data-root": "d:\\docker",
"storage-opts": [ "size=40G" ]
}
ãã«ãã·ã¹ãã ãšå¿ èŠãªãã¹ãŠãåãããšãŒãžã§ã³ãã®Dockerã€ã¡ãŒãžãäœæããã«ã¯ããDïŒ\ docker-agentããã£ã¬ã¯ããªã«ã次ã®å 容ã®Dockerãã¡ã€ã«ã远å ããŸãã
# escape=`
FROM mcr.microsoft.com/dotnet/framework/runtime
SHELL ["cmd", "/S", "/C"]
ADD https://aka.ms/vs/16/release/vs_buildtools.exe C:\vs_buildtools.exe
RUN C:\vs_buildtools.exe --quiet --wait --norestart --nocache `
--installPath C:\BuildTools `
--add Microsoft.VisualStudio.Workload.VCTools `
--includeRecommended
RUN powershell.exe -Command `
Set-ExecutionPolicy Bypass -Scope Process -Force; `
[System.Net.ServicePointManager]::SecurityProtocol =
[System.Net.ServicePointManager]::SecurityProtocol -bor 3072; `
iex ((New-Object System.Net.WebClient)
.DownloadString('https://chocolatey.org/install.ps1')); `
choco feature enable -n=useRememberedArgumentsForUpgrades;
RUN powershell.exe -Command `
choco install -y cmake --installargs '"ADD_CMAKE_TO_PATH=System"'; `
choco install -y git --params '"/GitOnlyOnPath /NoShellIntegration"'
RUN powershell.exe -Command `
git clone https://github.com/microsoft/vcpkg.git; `
.\vcpkg\bootstrap-vcpkg -disableMetrics; `
$env:Path += '";C:\vcpkg"'; `
[Environment]::SetEnvironmentVariable(
'"Path"', $env:Path, [System.EnvironmentVariableTarget]::Machine); `
[Environment]::SetEnvironmentVariable(
'"VCPKG_DEFAULT_TRIPLET"', '"x64-windows"',
[System.EnvironmentVariableTarget]::Machine)
RUN powershell.exe -Command `
choco install -y pvs-studio; `
$env:Path += '";C:\Program Files (x86)\PVS-Studio"'; `
[Environment]::SetEnvironmentVariable(
'"Path"', $env:Path, [System.EnvironmentVariableTarget]::Machine)
RUN powershell.exe -Command `
$latest_agent =
Invoke-RestMethod -Uri "https://api.github.com/repos/Microsoft/
azure-pipelines-agent/releases/latest"; `
$latest_agent_version =
$latest_agent.name.Substring(1, $latest_agent.tag_name.Length-1); `
$latest_agent_url =
'"https://vstsagentpackage.azureedge.net/agent/"' + $latest_agent_version +
'"/vsts-agent-win-x64-"' + $latest_agent_version + '".zip"'; `
Invoke-WebRequest -Uri $latest_agent_url -Method Get -OutFile ./agent.zip; `
Expand-Archive -Path ./agent.zip -DestinationPath ./agent
USER ContainerAdministrator
RUN reg add hklm\system\currentcontrolset\services\cexecsvc
/v ProcessShutdownTimeoutSeconds /t REG_DWORD /d 60
RUN reg add hklm\system\currentcontrolset\control
/v WaitToKillServiceTimeout /t REG_SZ /d 60000 /f
ADD .\entrypoint.ps1 C:\entrypoint.ps1
SHELL ["powershell", "-Command",
"$ErrorActionPreference = 'Stop';
$ProgressPreference = 'SilentlyContinue';"]
ENTRYPOINT .\entrypoint.ps1
ãã®çµæãPVS-StudioãCMakeãããã³Gitãã€ã³ã¹ããŒã«ããããã®ChocolateyãåããMSBuild for C ++ã«åºã¥ããã«ãã·ã¹ãã ãäœæãããŸãããããžã§ã¯ããäŸåããã©ã€ãã©ãªã䟿å©ã«ç®¡çããããã«ãVcpkgãæ§ç¯ãããŠããŸãããŸããææ°ããŒãžã§ã³ã®Azure PipelinesAgentãããŠã³ããŒããããŸãã
ENTRYPOINT Dockerãã¡ã€ã«ãããšãŒãžã§ã³ããåæåããã«ã¯ãPowerShellã¹ã¯ãªãããentrypoint.ps1ããåŒã³åºãããŸãããã®ã¹ã¯ãªããã«ããããžã§ã¯ãã®ãçµç¹ãURLããšãŒãžã§ã³ãããŒã«ããŒã¯ã³ãããã³PVS-Studioã©ã€ã»ã³ã¹ãã©ã¡ãŒã¿ã远å ããå¿ èŠããããŸãã
$organization_url = "https://dev.azure.com/< Microsoft Azure>"
$agents_token = "<token >"
$pvs_studio_user = "< PVS-Studio>"
$pvs_studio_key = "< PVS-Studio>"
try
{
C:\BuildTools\VC\Auxiliary\Build\vcvars64.bat
PVS-Studio_Cmd credentials -u $pvs_studio_user -n $pvs_studio_key
.\agent\config.cmd --unattended `
--url $organization_url `
--auth PAT `
--token $agents_token `
--replace;
.\agent\run.cmd
}
finally
{
# Agent graceful shutdown
# https://github.com/moby/moby/issues/25982
.\agent\config.cmd remove --unattended `
--auth PAT `
--token $agents_token
}
ã€ã¡ãŒãžãæ§ç¯ããŠãšãŒãžã§ã³ããèµ·åããããã®ã³ãã³ãïŒ
docker build -t azure-agent -m 4GB .
docker run -id --name my-agent -m 4GB --cpu-count 4 azure-agent

ãšãŒãžã§ã³ãã¯å®è¡äžã§ãããã¿ã¹ã¯ãå®è¡ããæºåãã§ããŠããŸãã

ã»ã«ããã¹ããšãŒãžã§ã³ãã§ã®åæã®å®è¡
PRåæã®å Žåãæ¬¡ã®ã¹ã¯ãªããã䜿çšããŠæ°ãããã€ãã©ã€ã³ãäœæãããŸãã

trigger: none
pr:
branches:
include:
- '*'
pool: Default
steps:
- script: git diff --name-only
origin/%SYSTEM_PULLREQUEST_TARGETBRANCH% >
diff-files.txt
displayName: 'Get committed files'
- script: |
cd C:\vcpkg
git pull --rebase origin
CMD /C ".\bootstrap-vcpkg -disableMetrics"
vcpkg install ^
irrlicht zlib curl[winssl] openal-soft libvorbis ^
libogg sqlite3 freetype luajit
vcpkg upgrade --no-dry-run
displayName: 'Manage dependencies (Vcpkg)'
- task: CMake@1
inputs:
cmakeArgs: -A x64
-DCMAKE_TOOLCHAIN_FILE=C:/vcpkg/scripts/buildsystems/vcpkg.cmake
-DCMAKE_BUILD_TYPE=Release -DENABLE_GETTEXT=0 -DENABLE_CURSES=0 ..
displayName: 'Run CMake'
- task: MSBuild@1
inputs:
solution: '**/*.sln'
msbuildArchitecture: 'x64'
platform: 'x64'
configuration: 'Release'
maximumCpuCount: true
displayName: 'Build'
- script: |
IF EXIST .\PVSTestResults RMDIR /Q/S .\PVSTestResults
md .\PVSTestResults
PVS-Studio_Cmd ^
-t .\build\minetest.sln ^
-S minetest ^
-o .\PVSTestResults\minetest.plog ^
-c Release ^
-p x64 ^
-f diff-files.txt ^
-D C:\caches
PlogConverter ^
-t FullHtml ^
-o .\PVSTestResults\ ^
-a GA:1,2,3;64:1,2,3;OP:1,2,3 ^
.\PVSTestResults\minetest.plog
IF NOT EXIST "$(Build.ArtifactStagingDirectory)" ^
MKDIR "$(Build.ArtifactStagingDirectory)"
powershell -Command ^
"Compress-Archive -Force ^
'.\PVSTestResults\fullhtml' ^
'$(Build.ArtifactStagingDirectory)\fullhtml.zip'"
displayName: 'PVS-Studio analyze'
continueOnError: true
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'psv-studio-analisys'
publishLocation: 'Container'
displayName: 'Publish analysis report'
ãã®ã¹ã¯ãªããã¯ãPRãåä¿¡ããããšãã«ããªã¬ãŒãããããã©ã«ãã®ããŒã«ã«å²ãåœãŠããããšãŒãžã§ã³ãã§å®è¡ãããŸããããªãã¯åœŒã«ãã®ããŒã«ã§åãèš±å¯ãäžããå¿ èŠãããã ãã§ãã


ã¹ã¯ãªããã¯ãgitdiffã䜿çšããŠååŸãã倿޿žã¿ãã¡ã€ã«ã®ãªã¹ããä¿åããŸããæ¬¡ã«ãäŸåé¢ä¿ãæŽæ°ãããCMakeãä»ããŠãããžã§ã¯ããœãªã¥ãŒã·ã§ã³ãçæããããã«ããããŸãã
ãã«ããæåãããšã倿Žããããã¡ã€ã«ã®åæãéå§ããïŒãã©ã° '-f diff-files.txt'ïŒãCMakeã«ãã£ãŠäœæãããè£å©ãããžã§ã¯ãã¯ç¡èŠãããŸãïŒ '-S minetest'ãã©ã°ãæã€å¿ èŠãªãããžã§ã¯ãã®ã¿ãéžæããŸãïŒãããããŒãšC ++ãœãŒã¹ãã¡ã€ã«éã®ãªã³ã¯ã®æ€çŽ¢ãé«éåããããã«ãç¹å¥ãªãã£ãã·ã¥ãäœæãããå¥ã®ãã£ã¬ã¯ããªã«ä¿åãããŸãïŒãã©ã° '-DCïŒ\ caches'ïŒã
ããã§ããããžã§ã¯ãã®å€æŽã®åæã«é¢ããã¬ããŒããåãåãããšãã§ããŸãã


èšäºã®åé ã§è¿°ã¹ãããã«ãã»ã«ããã¹ããšãŒãžã§ã³ãã䜿çšããããšã®æ¥œããããŒãã¹ã¯ãäžéãã¡ã€ã«ã®ããŒã«ã«ã¹ãã¬ãŒãžã«ããã¿ã¹ã¯å®è¡ã®é¡èãªå éã§ãã

Minetestã§èŠã€ãã£ãããã€ãã®ãã°
çµæã®äžæžã
V519ãcolor_nameã倿°ã«ã¯2åé£ç¶ããŠå€ãå²ãåœãŠãããŸããããããããã¯ééãã§ãããã§ãã¯è¡ïŒ621ã627ãstring.cpp 627
static bool parseNamedColorString(const std::string &value,
video::SColor &color)
{
std::string color_name;
std::string alpha_string;
size_t alpha_pos = value.find('#');
if (alpha_pos != std::string::npos) {
color_name = value.substr(0, alpha_pos);
alpha_string = value.substr(alpha_pos + 1);
} else {
color_name = value;
}
color_name = lowercase(value); // <=
std::map<const std::string, unsigned>::const_iterator it;
it = named_colors.colors.find(color_name);
if (it == named_colors.colors.end())
return false;
....
}
ãã®é¢æ°ã¯ãéæåºŠãã©ã¡ãŒã¿ãŒïŒããšãã°ãGreenïŒ77ïŒã䜿çšããŠè²åãè§£æãããã®ã³ãŒããè¿ãå¿ èŠããããŸããæ¡ä»¶ãã§ãã¯ã®çµæã«å¿ããŠãè¡åå²ã®çµæãŸãã¯é¢æ°åŒæ°ã®ã³ããŒãcolor_name倿°ã«æž¡ãããŸãããã ããçµæã®æååèªäœã¯å°æåã«å€æãããã®ã§ã¯ãªããå ã®åŒæ°ã«å€æãããŸãããã®çµæãéæåºŠãã©ã¡ãŒã¿ãååšããå Žåãã«ã©ãŒãã£ã¯ã·ã§ããªã§èŠã€ããããšãã§ããŸããããã®è¡ã¯æ¬¡ã®ããã«ä¿®æ£ã§ããŸãã
color_name = lowercase(color_name);
äžèŠãªæ¡ä»¶ãã§ãã¯V547åŒ 'nearest_emergefull_d ==-1'ã¯åžžã«çã§ããclientiface.cpp 363
void RemoteClient::GetNextBlocks (....)
{
....
s32 nearest_emergefull_d = -1;
....
s16 d;
for (d = d_start; d <= d_max; d++) {
....
if (block == NULL || surely_not_found_on_disk || block_is_invalid) {
if (emerge->enqueueBlockEmerge(peer_id, p, generate)) {
if (nearest_emerged_d == -1)
nearest_emerged_d = d;
} else {
if (nearest_emergefull_d == -1) // <=
nearest_emergefull_d = d;
goto queue_full_break;
}
....
}
....
queue_full_break:
if (nearest_emerged_d != -1) { // <=
new_nearest_unsent_d = nearest_emerged_d;
} else ....
}
near_emergefull_d 倿°ã¯ã«ãŒãæäœäžã«å€æŽãããããã®ãã§ãã¯ã¯ã¢ã«ãŽãªãºã ã®å®è¡ã«åœ±é¿ãäžããŸãããããã¯äžæ£ç¢ºãªã³ããŒïŒããŒã¹ãã®çµæã§ããããããã䜿ã£ãŠèšç®ãè¡ãã®ãå¿ããŠããŸããã
V560æ¡ä»¶åŒã®äžéšã¯åžžã«falseã§ãïŒy> max_spawn_yãmapgen_v7.cpp 262
int MapgenV7::getSpawnLevelAtPoint(v2s16 p)
{
....
while (iters > 0 && y <= max_spawn_y) { // <=
if (!getMountainTerrainAtPoint(p.X, y + 1, p.Y)) {
if (y <= water_level || y > max_spawn_y) // <=
return MAX_MAP_GENERATION_LIMIT; // Unsuitable spawn point
// y + 1 due to biome 'dust'
return y + 1;
}
....
}
' y '倿°ã®å€ã¯ãã«ãŒãã®æ¬¡ã®å埩ã®åã«ãã§ãã¯ãããŸãããã®åŸã®åå¯Ÿã®æ¯èŒã§ã¯ãåžžã«falseãè¿ãããéåžžãæ¡ä»¶ãã¹ãã®çµæã«ã¯åœ±é¿ããŸããã
ãã€ã³ã¿ã®åªå€±ã¯ããm_clientããã€ã³ã¿ã®V595ããã§ãã¯ããŸãã
ããã¯ãITãnullptrã«å¯ŸããŠæ€èšŒãããåã«äœ¿çšãããŠããŸããããã§ãã¯ã©ã€ã³ïŒ183ã187ãgame.cpp 183
void gotText(const StringMap &fields)
{
....
if (m_formname == "MT_DEATH_SCREEN") {
assert(m_client != 0);
m_client->sendRespawn();
return;
}
if (m_client && m_client->modsLoaded())
m_client->getScript()->on_formspec_input(m_formname, fields);
}
m_client ãã€ã³ã¿ãŒã«ã¢ã¯ã»ã¹ããåã«ãassertãã¯ãã䜿çšããŠnullã§ãªããã©ããããã§ãã¯ãããŸãããã ããããã¯ãããã°ãã«ãã«ã®ã¿é©çšãããŸãããã®ãããªäºé²çã¯ããªãªãŒã¹ã«çµã¿èŸŒããšãã«ãããŒã«çœ®ãæããããnullãã€ã³ã¿ãŒãåç §è§£é€ãããªã¹ã¯ããããŸãã
ãããããããã§ã¯ãªãïŒ
V616ãããåäœã®æäœã§ã¯ãå€ã0ã®ãïŒFT_RENDER_MODE_NORMALïŒããšããååã®å®æ°ã䜿çšãããŸãã CGUITTFont.h 360
typedef enum FT_Render_Mode_
{
FT_RENDER_MODE_NORMAL = 0,
FT_RENDER_MODE_LIGHT,
FT_RENDER_MODE_MONO,
FT_RENDER_MODE_LCD,
FT_RENDER_MODE_LCD_V,
FT_RENDER_MODE_MAX
} FT_Render_Mode;
#define FT_LOAD_TARGET_( x ) ( (FT_Int32)( (x) & 15 ) << 16 )
#define FT_LOAD_TARGET_NORMAL FT_LOAD_TARGET_( FT_RENDER_MODE_NORMAL )
void update_load_flags()
{
// Set up our loading flags.
load_flags = FT_LOAD_DEFAULT | FT_LOAD_RENDER;
if (!useHinting()) load_flags |= FT_LOAD_NO_HINTING;
if (!useAutoHinting()) load_flags |= FT_LOAD_NO_AUTOHINT;
if (useMonochrome()) load_flags |=
FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO | FT_RENDER_MODE_MONO;
else load_flags |= FT_LOAD_TARGET_NORMAL; // <=
}
FT_LOAD_TARGET_NORMAL ãã¯ããæ¡åŒµããŒãã«ãããããåäœããŸãã¯ããã®ããããã®ãã©ã°ãèšå®ãããŠããªãã ããload_flagsããä»ã®æãåãé€ãããšãã§ããŸãã
æŽæ°é€ç®ãäžžã
V636ã¶ãrect.getHeightïŒïŒ/ 16ãçºçŸã¯æé»ããããŒããã¿ã€ãã«ãINTãã¿ã€ããããã£ã¹ãããŸãããéšåçãªéšåã®æå€±ãåé¿ããããã«ãæç€ºçãªåãã£ã¹ããå©çšããããšãæ€èšããŠãã ãããäŸïŒdouble A =ïŒdoubleïŒïŒXïŒ/ Y;ã hud.cpp 771
void drawItemStack(....)
{
float barheight = rect.getHeight() / 16;
float barpad_x = rect.getWidth() / 16;
float barpad_y = rect.getHeight() / 16;
core::rect<s32> progressrect(
rect.UpperLeftCorner.X + barpad_x,
rect.LowerRightCorner.Y - barpad_y - barheight,
rect.LowerRightCorner.X - barpad_x,
rect.LowerRightCorner.Y - barpad_y);
}
RECTã® ã²ãã¿ãŒã¯ãæŽæ°å€ãè¿ããŸããæŽæ°ã®é€ç®ã®çµæã¯æµ®åå°æ°ç¹å€æ°ã«æžã蟌ãŸããåæ°éšåã¯å€±ãããŸãããããã®èšç®ã«ã¯äžäžèŽã®ããŒã¿ã¿ã€ããããããã§ãã
çãããã·ãŒã±ã³ã¹åå²ã¹ããŒãã¡ã³ã
V646ã¢ããªã±ãŒã·ã§ã³ã®ããžãã¯ã®æ€æ»ãæ€èšããŠãã ããã 'else'ããŒã¯ãŒããæ¬ èœããŠããå¯èœæ§ããããŸãã treegen.cpp 413
treegen::error make_ltree(...., TreeDef tree_definition)
{
....
std::stack <core::matrix4> stack_orientation;
....
if ((stack_orientation.empty() &&
tree_definition.trunk_type == "double") ||
(!stack_orientation.empty() &&
tree_definition.trunk_type == "double" &&
!tree_definition.thin_branches)) {
....
} else if ((stack_orientation.empty() &&
tree_definition.trunk_type == "crossed") ||
(!stack_orientation.empty() &&
tree_definition.trunk_type == "crossed" &&
!tree_definition.thin_branches)) {
....
} if (!stack_orientation.empty()) { // <=
....
}
....
}
ããªãŒçæã¢ã«ãŽãªãºã ã®else-ifã·ãŒã±ã³ã¹ã¯æ¬¡ã®ãšããã§ããçãäžã§ã次ã®ifãããã¯ã¯ãåã®elseã®éãæ¬åŒ§ãšåãè¡ã«ãããŸãããã®åã«ïŒãããããã³ãŒããæ£ããåäœããŠããå Žå-aã¯ããã©ã³ã¯ã»ãããã¯ãäœæããããã®åŸãèããŸãã¯å€å圌ãã¯ä»ãéããã確ãã«ãããã¯éçºè ã ããèšãããšãã§ããŸãã
誀ã£ãã¡ã¢ãªå²ãåœãŠãã§ãã¯
V668ã¡ã¢ãªã¯ãnewãæŒç®åã䜿çšããŠå²ãåœãŠãããããããcloudsããã€ã³ã¿ãnullã«å¯ŸããŠãã¹ãããŠãæå³ããããŸãããã¡ã¢ãªå²ãåœãŠãšã©ãŒã®å ŽåãäŸå€ãçæãããŸãã game.cpp 1367
bool Game::createClient(....)
{
if (m_cache_enable_clouds) {
clouds = new Clouds(smgr, -1, time(0));
if (!clouds) {
*error_message = "Memory allocation error (clouds)";
errorstream << *error_message << std::endl;
return false;
}
}
}
newããªããžã§ã¯ãã®äœæã«å€±æãã å Žåãstd :: bad_allocäŸå€ãã¹ããŒãããtry-catchãããã¯ã§åŠçããå¿ èŠããããŸãããããŠããã®ãã©ãŒã ã§ãã§ãã¯ããããšã¯ç¡æå³ã§ããç¯å²å€ã®
é åã®èªã¿åã
V781'i 'ã€ã³ããã¯ã¹ã®å€ã¯ã䜿çšåŸã«ãã§ãã¯ãããŸãããããããããã°ã©ã ããžãã¯ã«èª€ãããããŸããirrString.h 572
bool equalsn(const string<T,TAlloc>& other, u32 n) const
{
u32 i;
for(i=0; array[i] && other[i] && i < n; ++i) // <=
if (array[i] != other[i])
return false;
// if one (or both) of the strings was smaller then they
// are only equal if they have the same length
return (i == n) || (used == other.used);
}
ã€ã³ããã¯ã¹ããã§ãã¯ããåã«é åèŠçŽ ã«ã¢ã¯ã»ã¹ããããããšã©ãŒãçºçããå¯èœæ§ããããŸãããã®ããã«ã«ãŒããæžãçŽã䟡å€ããããããããŸããïŒ
for (i=0; i < n; ++i) // <=
if (!array[i] || !other[i] || array[i] != other[i])
return false;
ãã®ä»ã®ãšã©ãŒ
ãã®èšäºã¯ãAzure DevOpsã§ã®ãã«ãªã¯ãšã¹ãã®åæã«é¢ãããã®ã§ãããMinetestãããžã§ã¯ãã®ãšã©ãŒã®è©³çŽ°ãªæŠèŠãæäŸããããšãç®çãšãããã®ã§ã¯ãããŸããããããç§ãé¢çœããšæã£ãã³ãŒãã¹ããããã®ã»ãã®äžéšã§ãããããžã§ã¯ãã®äœæè ã¯ããã®èšäºã«åŸããã«ãšã©ãŒãä¿®æ£ããPVS-Studioãçºè¡ããèŠåããã培åºçã«åæããããšããå§ãããŸãã
çµè«
ã³ãã³ãã©ã€ã³ã¢ãŒãã®æè»ãªæ§æã®ãããã§ãPVS-StudioåæãããŸããŸãªCI / CDã·ããªãªã«çµã¿èŸŒãããšãã§ããŸãããŸããå©çšå¯èœãªãªãœãŒã¹ãé©åã«äœ¿çšããããšã§ãçç£æ§ãåäžããŸãã
ãã«ãªã¯ãšã¹ããã§ãã¯ã¢ãŒãã¯ãã¢ãã©ã€ã¶ã®Enterpriseãšãã£ã·ã§ã³ã§ã®ã¿äœ¿çšã§ããããšã«æ³šæããŠãã ããããã¢ãšã³ã¿ãŒãã©ã€ãºã©ã€ã»ã³ã¹ãååŸããã«ã¯ãããŠã³ããŒãããŒãžã§ã©ã€ã»ã³ã¹ããªã¯ãšã¹ããããšãã«ã³ã¡ã³ãã«ããã瀺ããŠãã ãããã©ã€ã»ã³ã¹éã®éãã«ã€ããŠè©³ããã¯ãPVS-Studioã®æ³šæããŒãžãã芧ãã ããã

ãã®èšäºãè±èªã話ãèŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãªã³ã¯ã䜿çšããŠãã ããïŒAlexeyGovorovãPVS-StudioïŒã»ã«ããã¹ããšãŒãžã§ã³ãã䜿çšããŠAzureDevOpsã§ãã«ãªã¯ãšã¹ããåæããŸãã