Travis CI යනු GitHub ප්රභව කේත සත්කාරකත්වය ලෙස භාවිතා කරන මෘදුකාංග තැනීම සහ පරීක්ෂා කිරීම සඳහා බෙදා හරින ලද වෙබ් සේවාවකි. ඉහත මෙහෙයුම් අවස්ථා වලට අමතරව, ඔබට විස්තීර්ණ වින්යාස විකල්ප සඳහා ඔබේම ස්තුතිය එක් කළ හැකිය. මෙම ලිපියෙන් අපි PPSSPP කේත උදාහරණය භාවිතා කරමින් PVS-Studio සමඟ වැඩ කිරීමට Travis CI වින්යාස කරමු.
හැඳින්වීම
Travis CI පිහිටුවීම
අපට අවශ්ය ව්යාපෘතිය පිහිටා ඇති GitHub හි ගබඩාවක් මෙන්ම PVS-Studio සඳහා යතුරක් අපට අවශ්ය වනු ඇත (ඔබට ලබාගත හැක.
අපි සයිට් එකට යමු
පරීක්ෂණය සඳහා, මම PPSSPP ෆෝක් කළා.
අපට එකතු කිරීමට අවශ්ය ගබඩාව අපි සක්රිය කරමු:
මේ මොහොතේ, ට්රැවිස් සීඅයිට අපගේ ව්යාපෘතිය ගොඩනඟා ගත නොහැක, මන්ද ගොඩනැගීම සඳහා උපදෙස් නොමැත. එබැවින් එය වින්යාස කිරීමට කාලයයි.
විශ්ලේෂණය අතරතුර, සමහර විචල්යයන් අපට ප්රයෝජනවත් වනු ඇත, උදාහරණයක් ලෙස, PVS-Studio සඳහා යතුර, වින්යාස ගොනුවේ සඳහන් කිරීමට නුසුදුසු වනු ඇත. එබැවින් ට්රැවිස් සීඅයි හි ගොඩනැගීමේ සැකසුම් භාවිතා කර පරිසර විචල්ය එකතු කරමු:
අපට අවශ්ය වනු ඇත:
- PVS_USERNAME - පරිශීලක නාමය
- PVS_KEY - යතුර
- MAIL_USER - වාර්තාව යැවීමට භාවිතා කරන විද්යුත් තැපෑල
- MAIL_PASSWORD - ඊමේල් මුරපදය
අවසාන දෙක විකල්ප වේ. මේවා තැපෑලෙන් ප්රතිඵල යැවීමට භාවිත කරනු ඇත. ඔබට වාර්තාව වෙනත් ආකාරයකින් බෙදා හැරීමට අවශ්ය නම්, ඔබට ඒවා සඳහන් කිරීමට අවශ්ය නොවේ.
එබැවින්, අපට අවශ්ය පරිසර විචල්යයන් අපි එකතු කර ඇත්තෙමු:
දැන් අපි file එකක් හදමු .travis.yml සහ එය ව්යාපෘතියේ මූලයේ තබන්න. PPSSPP සතුව දැනටමත් ට්රැවිස් සීඅයි සඳහා වින්යාස ගොනුවක් තිබුණි, කෙසේ වෙතත්, එය ඉතා විශාල වූ අතර උදාහරණයට සම්පූර්ණයෙන්ම නොගැලපෙන බැවින් අපට එය බෙහෙවින් සරල කර මූලික අංග පමණක් ඉතිරි කිරීමට සිදු විය.
පළමුව, අපි අථත්ය යන්ත්රයේ භාවිතා කිරීමට අවශ්ය භාෂාව, උබුන්ටු ලිනක්ස් අනුවාදය සහ ගොඩනැගීම සඳහා අවශ්ය පැකේජ සඳහන් කරමු:
language: cpp
dist: xenial
addons:
apt:
update: true
packages:
- ant
- aria2
- build-essential
- cmake
- libgl1-mesa-dev
- libglu1-mesa-dev
- libsdl2-dev
- pv
- sendemail
- software-properties-common
sources:
- sourceline: 'ppa:ubuntu-toolchain-r/test'
- sourceline: 'ppa:ubuntu-sdk-team/ppa'
ලැයිස්තුගත කර ඇති සියලුම පැකේජ PPSSPP සඳහා පමණක් අවශ්ය වේ.
දැන් අපි එකලස් කිරීමේ අනුකෘතිය දක්වන්නෙමු:
matrix:
include:
- os: linux
compiler: "gcc"
env: PPSSPP_BUILD_TYPE=Linux PVS_ANALYZE=Yes
- os: linux
compiler: "clang"
env: PPSSPP_BUILD_TYPE=Linux
කොටස ගැන තව ටිකක් අනුකෘතියයි. ට්රැවිස් සීඅයි හි, ගොඩ නැගීමේ විකල්ප නිර්මාණය කිරීමට ක්රම දෙකක් තිබේ: පළමුවැන්න නම් සම්පාදක ලැයිස්තුවක්, මෙහෙයුම් පද්ධති වර්ග, පරිසර විචල්යයන් යනාදිය සඳහන් කිරීමයි, ඉන් පසුව හැකි සියලුම සංයෝජනවල න්යාසයක් ජනනය වේ; දෙවැන්න අනුකෘතියේ පැහැදිලි ඇඟවීමකි. ඇත්ත වශයෙන්ම, ඔබට මෙම ප්රවේශයන් දෙක ඒකාබද්ධ කර අද්විතීය නඩුවක් එක් කළ හැකිය, නැතහොත්, ඊට පටහැනිව, කොටස භාවිතයෙන් එය බැහැර කරන්න බැහැර කරයි. ඔබට මේ ගැන වැඩිදුර කියවිය හැකිය
ඉතිරිව ඇත්තේ ව්යාපෘති-විශේෂිත එකලස් කිරීමේ උපදෙස් සැපයීම පමණි:
before_install:
- travis_retry bash .travis.sh travis_before_install
install:
- travis_retry bash .travis.sh travis_install
script:
- bash .travis.sh travis_script
after_success:
- bash .travis.sh travis_after_success
ට්රැවිස් සීඅයි ඔබට අථත්ය යන්ත්රයක ජීවිතයේ විවිධ අවස්ථා සඳහා ඔබේම විධාන එකතු කිරීමට ඉඩ සලසයි. අංශය ස්ථාපනය කිරීමට පෙර පැකේජ ස්ථාපනය කිරීමට පෙර ක්රියාත්මක කර ඇත. ඉන්පසු ස්ථාපනය කරන්න, ලැයිස්තුවෙන් පැකේජ ස්ථාපනය කිරීම අනුගමනය කරයි addons.aptඅපි ඉහත දක්වා ඇති. එකලස් කිරීමම සිදු වේ තිර රචනය. සෑම දෙයක්ම හොඳින් සිදු වූවා නම්, අපි අපවම සොයා ගනිමු පසු_සාර්ථකත්වය (අපි ස්ථිතික විශ්ලේෂණය ක්රියාත්මක කරන්නේ මෙම කොටසෙහි ය). මේ සියල්ල වෙනස් කළ හැකි පියවර නොවේ, ඔබට තවත් අවශ්ය නම්, ඔබ බැලිය යුතුය
කියවීමේ පහසුව සඳහා, විධාන වෙනම පිටපතක තබා ඇත .travis.sh, ව්යාපෘති මූලයේ තබා ඇත.
එබැවින් අපට පහත ගොනුව ඇත .travis.yml:
language: cpp
dist: xenial
addons:
apt:
update: true
packages:
- ant
- aria2
- build-essential
- cmake
- libgl1-mesa-dev
- libglu1-mesa-dev
- libsdl2-dev
- pv
- sendemail
- software-properties-common
sources:
- sourceline: 'ppa:ubuntu-toolchain-r/test'
- sourceline: 'ppa:ubuntu-sdk-team/ppa'
matrix:
include:
- os: linux
compiler: "gcc"
env: PVS_ANALYZE=Yes
- os: linux
compiler: "clang"
before_install:
- travis_retry bash .travis.sh travis_before_install
install:
- travis_retry bash .travis.sh travis_install
script:
- bash .travis.sh travis_script
after_success:
- bash .travis.sh travis_after_success
පැකේජ ස්ථාපනය කිරීමට පෙර, අපි උප මොඩියුල යාවත්කාලීන කරන්නෙමු. PPSSPP ගොඩනැගීමට මෙය අවශ්ය වේ. අපි පළමු කාර්යය එකතු කරමු .travis.sh (දිගුව සටහන් කරන්න):
travis_before_install() {
git submodule update --init --recursive
}
දැන් අපි Travis CI හි PVS-Studio හි ස්වයංක්රීය දියත් කිරීම සැකසීමට කෙලින්ම පැමිණෙමු. මුලින්ම අපි පද්ධතිය මත PVS-Studio පැකේජය ස්ථාපනය කළ යුතුය:
travis_install() {
if [ "$CXX" = "g++" ]; then
sudo apt-get install -qq g++-4.8
fi
if [ "$PVS_ANALYZE" = "Yes" ]; then
wget -q -O - https://files.viva64.com/etc/pubkey.txt
| sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio
libio-socket-ssl-perl
libnet-ssleay-perl
fi
download_extract
"https://cmake.org/files/v3.6/cmake-3.6.2-Linux-x86_64.tar.gz"
cmake-3.6.2-Linux-x86_64.tar.gz
}
කාර්යය ආරම්භයේදී travis_install පරිසර විචල්යයන් භාවිතයෙන් අපට අවශ්ය සම්පාදක ස්ථාපනය කරමු. එවිට විචල්යය නම් $PVS_ANALYZE අගය ගබඩා කරයි ඔව් (අපි එය කොටසේ දක්වා ඇත දළ වශයෙන් ගොඩනැගීමේ matrix වින්යාසය අතරතුර), අපි පැකේජය ස්ථාපනය කරමු pvs-studio. මීට අමතරව, පැකේජ ද දක්වනු ලැබේ libio-socket-ssl-perl и libnet-ssley-perl, කෙසේ වෙතත්, ඒවා තැපැල් කිරීමේ ප්රතිඵල සඳහා අවශ්ය වේ, එබැවින් ඔබ ඔබේ වාර්තාව ලබා දීම සඳහා වෙනත් ක්රමයක් තෝරාගෙන තිබේ නම් ඒවා අවශ්ය නොවේ.
උත්සවය බාගත_උපුටා ගැනීම නිශ්චිත සංරක්ෂිතය බාගත කර අසුරන්න:
download_extract() {
aria2c -x 16 $1 -o $2
tar -xf $2
}
ව්යාපෘතිය එකට එකතු කිරීමට කාලයයි. කොටසේ මෙය සිදු වේ තිර රචනය:
travis_script() {
if [ -d cmake-3.6.2-Linux-x86_64 ]; then
export PATH=$(pwd)/cmake-3.6.2-Linux-x86_64/bin:$PATH
fi
CMAKE_ARGS="-DHEADLESS=ON ${CMAKE_ARGS}"
if [ "$PVS_ANALYZE" = "Yes" ]; then
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi
cmake $CMAKE_ARGS CMakeLists.txt
make
}
ඇත්ත වශයෙන්ම, මෙම රේඛා හැර මෙය සරල කළ මුල් වින්යාසයකි:
if [ "$PVS_ANALYZE" = "Yes" ]; then
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi
මෙම කේත කොටසේ අපි සකසන්නෙමු cmake සම්පාදන විධාන අපනයනය සඳහා ධජය. ස්ථිතික කේත විශ්ලේෂකය සඳහා මෙය අවශ්ය වේ. ඔබට මේ ගැන වැඩි විස්තර ලිපියෙන් කියවිය හැකිය "
එකලස් කිරීම සාර්ථක වූවා නම්, අපි එය ලබා ගනිමු පසු_සාර්ථකත්වය, අපි ස්ථිතික විශ්ලේෂණය සිදු කරන ස්ථානය:
travis_after_success() {
if [ "$PVS_ANALYZE" = "Yes" ]; then
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic
pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic
-o PVS-Studio-${CC}.log
--disableLicenseExpirationCheck
plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html
sendemail -t [email protected]
-u "PVS-Studio $CC report, commit:$TRAVIS_COMMIT"
-m "PVS-Studio $CC report, commit:$TRAVIS_COMMIT"
-s smtp.gmail.com:587
-xu $MAIL_USER
-xp $MAIL_PASSWORD
-o tls=yes
-f $MAIL_USER
-a PVS-Studio-${CC}.log PVS-Studio-${CC}.html
fi
}
පහත රේඛා දෙස සමීපව බලමු:
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic
pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic
-o PVS-Studio-${CC}.log
--disableLicenseExpirationCheck
plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html
පළමු පේළිය ට්රැවිස් සීඅයි පරිසර විචල්යයන් පිහිටුවීමේදී අප ආරම්භයේදීම සඳහන් කළ පරිශීලක නාමය සහ යතුරෙන් බලපත්ර ගොනුවක් ජනනය කරයි.
දෙවන පේළිය විශ්ලේෂණය කෙලින්ම ආරම්භ කරයි. ධජ -ජේ විශ්ලේෂණය සඳහා නූල් ගණන සකසයි, ධජය -එල් බලපත්රය, ධජය පෙන්නුම් කරයි -o ලඝු-සටහන් ප්රතිදානය සඳහා ගොනුව සහ ධජය නිර්වචනය කරයි - disableLicense Expiration Check පෙරනිමියෙන් සිට අත්හදා බැලීම් අනුවාද සඳහා අවශ්ය වේ pvs-studio-analyzer බලපත්රය කල් ඉකුත් වීමට ආසන්න බව පරිශීලකයාට අනතුරු අඟවයි. මෙය සිදුවීම වලක්වා ගැනීම සඳහා, ඔබට මෙම ධජය නියම කළ හැක.
ලොග් ගොනුවේ පරිවර්තනයකින් තොරව කියවිය නොහැකි raw output අඩංගු වේ, එබැවින් ඔබ ප්රථමයෙන් ගොනුව කියවිය හැකි බවට පත් කළ යුතුය. අපි ලඝු-සටහන් හරහා යමු ප්ලොග්-පරිවර්තකය, සහ ප්රතිදානය html ගොනුවකි.
මෙම උදාහරණයේදී, මම විධානය භාවිතා කර තැපෑලෙන් වාර්තා යැවීමට තීරණය කළෙමි යවන්න.
එහි ප්රතිඵලයක් වශයෙන්, අපි පහත ගොනුව ලබා ගත්තා .travis.sh:
#/bin/bash
travis_before_install() {
git submodule update --init --recursive
}
download_extract() {
aria2c -x 16 $1 -o $2
tar -xf $2
}
travis_install() {
if [ "$CXX" = "g++" ]; then
sudo apt-get install -qq g++-4.8
fi
if [ "$PVS_ANALYZE" = "Yes" ]; then
wget -q -O - https://files.viva64.com/etc/pubkey.txt
| sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio
libio-socket-ssl-perl
libnet-ssleay-perl
fi
download_extract
"https://cmake.org/files/v3.6/cmake-3.6.2-Linux-x86_64.tar.gz"
cmake-3.6.2-Linux-x86_64.tar.gz
}
travis_script() {
if [ -d cmake-3.6.2-Linux-x86_64 ]; then
export PATH=$(pwd)/cmake-3.6.2-Linux-x86_64/bin:$PATH
fi
CMAKE_ARGS="-DHEADLESS=ON ${CMAKE_ARGS}"
if [ "$PVS_ANALYZE" = "Yes" ]; then
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
fi
cmake $CMAKE_ARGS CMakeLists.txt
make
}
travis_after_success() {
if [ "$PVS_ANALYZE" = "Yes" ]; then
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY -o PVS-Studio.lic
pvs-studio-analyzer analyze -j2 -l PVS-Studio.lic
-o PVS-Studio-${CC}.log
--disableLicenseExpirationCheck
plog-converter -t html PVS-Studio-${CC}.log -o PVS-Studio-${CC}.html
sendemail -t [email protected]
-u "PVS-Studio $CC report, commit:$TRAVIS_COMMIT"
-m "PVS-Studio $CC report, commit:$TRAVIS_COMMIT"
-s smtp.gmail.com:587
-xu $MAIL_USER
-xp $MAIL_PASSWORD
-o tls=yes
-f $MAIL_USER
-a PVS-Studio-${CC}.log PVS-Studio-${CC}.html
fi
}
set -e
set -x
$1;
දැන් වෙනස්කම් git ගබඩාවට තල්ලු කිරීමට කාලයයි, ඉන්පසු ට්රැවිස් සීඅයි ස්වයංක්රීයව ගොඩනැගීම ක්රියාත්මක කරයි. ගොඩනැගීමේ වාර්තා වෙත යාමට "ppsspp" මත ක්ලික් කරන්න:
වත්මන් ගොඩනැගීම පිළිබඳ දළ විශ්ලේෂණයක් අපි දකිමු:
ගොඩනැගීම සාර්ථකව නිම කළහොත්, ස්ථිතික විශ්ලේෂණයේ ප්රතිඵල සහිත විද්යුත් තැපෑලක් අපට ලැබෙනු ඇත. ඇත්ත වශයෙන්ම, වාර්තාවක් ලැබීමට ඇති එකම මාර්ගය තැපැල් කිරීම නොවේ. ඔබට ඕනෑම ක්රියාත්මක කිරීමේ ක්රමයක් තෝරා ගත හැකිය. නමුත් මතක තබා ගැනීම වැදගත් වන්නේ ගොඩනැගීම අවසන් වූ පසු, අථත්ය යන්ත්ර ගොනු වෙත ප්රවේශ වීමට නොහැකි වනු ඇති බවයි.
දෝෂ සාරාංශය
අපි අමාරුම කොටස සාර්ථකව නිම කළා. දැන් අපි අපේ සියලු උත්සාහයන් වටින බව සහතික කරමු. තැපෑලෙන් මා වෙත පැමිණි ස්ථිතික විශ්ලේෂණ වාර්තාවෙන් රසවත් කරුණු කිහිපයක් බලමු (මා එය ඇඟවුම් කළේ නිකම්ම නොවේ).
භයානක ප්රශස්තකරණය
void sha1( unsigned char *input, int ilen, unsigned char output[20] )
{
sha1_context ctx;
sha1_starts( &ctx );
sha1_update( &ctx, input, ilen );
sha1_finish( &ctx, output );
memset( &ctx, 0, sizeof( sha1_context ) );
}
PVS-Studio අනතුරු ඇඟවීම:
මෙම කේත කොටස ආරක්ෂිත හැෂිං මොඩියුලයේ පිහිටා ඇත, කෙසේ වෙතත්, එහි බරපතල ආරක්ෂක දෝෂයක් අඩංගු වේ (
; Line 355
mov r8d, 20
xor edx, edx
lea rcx, QWORD PTR sum$[rsp]
call memset
; Line 356
සෑම දෙයක්ම පිළිවෙලට හා කාර්යයට අනුකූල වේ මෙම්සෙට් ක්රියාත්මක වේ, එමගින් RAM හි වැදගත් දත්ත නැවත ලිවීම, කෙසේ වෙතත්, තවමත් ප්රීති නොවන්න. ප්රශස්තිකරණය සමඟ මුදා හැරීමේ අනුවාදයේ එකලස් කිරීමේ ලැයිස්තුව දෙස බලමු:
; 354 :
; 355 : memset( sum, 0, sizeof( sum ) );
; 356 :}
ලැයිස්තුගත කිරීමෙන් දැකිය හැකි පරිදි, සම්පාදකයා ඇමතුම නොසලකා හැර ඇත මෙම්සෙට්. මෙය කාර්යයේ දී ඇති බව ය ෂැන්හුන්ස් ඇමතුමෙන් පසුව මෙම්සෙට් ව්යුහය ගැන තවදුරටත් සඳහනක් නැත ctx. එමනිසා, අනාගතයේදී භාවිතා නොකරන මතකය නැවත ලිවීමේ ප්රොසෙසර කාලය නාස්ති කිරීමේ තේරුමක් සම්පාදකයාට නොපෙනේ. මෙම කාර්යය භාවිතා කිරීමෙන් ඔබට මෙය නිවැරදි කළ හැක RtlSecureZeroMemory හෝ
නිවැරදිව:
void sha1( unsigned char *input, int ilen, unsigned char output[20] )
{
sha1_context ctx;
sha1_starts( &ctx );
sha1_update( &ctx, input, ilen );
sha1_finish( &ctx, output );
RtlSecureZeroMemory(&ctx, sizeof( sha1_context ) );
}
අනවශ්ය සංසන්දනය
static u32 sceAudioOutputPannedBlocking
(u32 chan, int leftvol, int rightvol, u32 samplePtr) {
int result = 0;
// For some reason, this is the only one that checks for negative.
if (leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0) {
....
} else {
if (leftvol >= 0) {
chans[chan].leftVolume = leftvol;
}
if (rightvol >= 0) {
chans[chan].rightVolume = rightvol;
}
chans[chan].sampleAddress = samplePtr;
result = __AudioEnqueue(chans[chan], chan, true);
}
}
PVS-Studio අනතුරු ඇඟවීම:
පළමු සඳහා වෙනත් ශාඛාව වෙත අවධානය යොමු කරන්න if. කේතය ක්රියාත්මක වන්නේ සියලු කොන්දේසි වලට යටත්ව පමණි leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0 බොරු බවට හැරෙනු ඇත. එබැවින්, අපට පහත ප්රකාශ ලැබේ, එය අනෙක් ශාඛාව සඳහා සත්ය වනු ඇත: වම් පරිමාව <= 0xFFFF, rightvol <= 0xFFFF, වම් පරිමාව >= 0 и rightvol >= 0. අවසාන ප්රකාශ දෙක සැලකිල්ලට ගන්න. මෙම කේත කොටස ක්රියාත්මක කිරීම සඳහා අවශ්ය කොන්දේසිය කුමක්දැයි පරීක්ෂා කිරීම අර්ථවත්ද?
එබැවින් අපට මෙම කොන්දේසි සහිත ප්රකාශ ආරක්ෂිතව ඉවත් කළ හැකිය:
static u32 sceAudioOutputPannedBlocking
(u32 chan, int leftvol, int rightvol, u32 samplePtr) {
int result = 0;
// For some reason, this is the only one that checks for negative.
if (leftvol > 0xFFFF || rightvol > 0xFFFF || leftvol < 0 || rightvol < 0) {
....
} else {
chans[chan].leftVolume = leftvol;
chans[chan].rightVolume = rightvol;
chans[chan].sampleAddress = samplePtr;
result = __AudioEnqueue(chans[chan], chan, true);
}
}
තවත් ජවනිකාවක්. මෙම අතිරික්ත කොන්දේසි පිටුපස යම් ආකාරයක දෝෂයක් සැඟවී ඇත. සමහර විට ඔවුන් අවශ්ය දේ පරීක්ෂා කර නැත.
Ctrl+C Ctrl+V ආපසු පහර දෙයි
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfData) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
ඇතුළත චෙක්පත වෙත අවධානය යොමු කරන්න if. අපි ලිපිනය වලංගු දැයි පරීක්ෂා කිරීම අමුතු දෙයක් යැයි ඔබට සිතෙන්නේ නැද්ද? psmfData, දෙගුණයක්? එබැවින් මෙය මට අමුතු දෙයක් ලෙස පෙනේ ... ඇත්ත වශයෙන්ම, මෙය ටයිප් කිරීමේ දෝෂයක් වන අතර, ආදාන පරාමිති දෙකම පරීක්ෂා කිරීමට අදහස විය.
නිවැරදි විකල්පය:
static u32 scePsmfSetPsmf(u32 psmfStruct, u32 psmfData) {
if (!Memory::IsValidAddress(psmfStruct) ||
!Memory::IsValidAddress(psmfData)) {
return hleReportError(ME, SCE_KERNEL_ERROR_ILLEGAL_ADDRESS, "bad address");
}
....
}
අමතක වූ විචල්යය
extern void ud_translate_att(
int size = 0;
....
if (size == 8) {
ud_asmprintf(u, "b");
} else if (size == 16) {
ud_asmprintf(u, "w");
} else if (size == 64) {
ud_asmprintf(u, "q");
}
....
}
PVS-Studio අනතුරු ඇඟවීම:
මෙම දෝෂය ෆෝල්ඩරයේ පිහිටා ඇත එම්, ඒ නිසා ඇත්තටම ව්යාපෘතියට අදාළ නැහැ, නමුත් මම එය දැකීමට පෙර දෝෂය සොයා ගත්තා, ඒ නිසා මම එය අත්හැරීමට තීරණය කළා. සියල්ලට පසු, මෙම ලිපිය දෝෂ සමාලෝචනය කිරීම ගැන නොව, ට්රැවිස් සීඅයි සමඟ ඒකාබද්ධ කිරීම ගැන වන අතර, විශ්ලේෂකයේ වින්යාස කිරීමක් සිදු කර නොමැත.
විචල්ය විශාලත්වය නියතයක් මඟින් ආරම්භ කර ඇත, කෙසේ වෙතත්, එය ක්රියාකරු දක්වාම කේතයේ කිසිසේත් භාවිතා නොවේ if, එය, ඇත්ත වශයෙන්ම, ලබා දෙයි බොරු කොන්දේසි පරීක්ෂා කිරීමේදී, මන්ද, අපට මතක ඇති පරිදි, විශාලත්වය ශුන්යයට සමාන වේ. පසුකාලීන චෙක්පත්වල තේරුමක් නැත.
පෙනෙන විදිහට, කේත කොටසේ කතුවරයාට විචල්යය නැවත ලිවීමට අමතක විය විශාලත්වය ඊට කලින්.
නවත්වන්න
අපි බොහෝ විට වැරදි වලින් අවසන් වනු ඇත්තේ මෙතැනිනි. මෙම ලිපියේ අරමුණ ට්රැවිස් සීඅයි සමඟ එක්ව PVS-Studio හි වැඩ නිරූපණය කිරීම මිස ව්යාපෘතිය හැකිතාක් තරයේ විශ්ලේෂණය කිරීම නොවේ. ඔබට විශාල හා ලස්සන වැරදි අවශ්ය නම්, ඔබට සැමවිටම ඒවා අගය කළ හැකිය
නිගමනය
වර්ධක විශ්ලේෂණ භාවිතය සමඟ එක්ව ව්යාපෘති තැනීමට වෙබ් සේවා භාවිතා කිරීමෙන් කේතය ඒකාබද්ධ කිරීමෙන් පසු බොහෝ ගැටලු සොයා ගැනීමට ඔබට ඉඩ සලසයි. කෙසේ වෙතත්, එක් ගොඩනැගීමක් ප්රමාණවත් නොවිය හැක, එබැවින් ස්ථිතික විශ්ලේෂණය සමඟ එක්ව පරීක්ෂණ සැකසීම කේතයේ ගුණාත්මක භාවය සැලකිය යුතු ලෙස වැඩිදියුණු කරනු ඇත.
ප්රයෝජනවත් සබැඳි
Linux සහ macOS මත PVS-Studio දියත් කිරීම Docker හි PVS-Studio දියත් කිරීම ට්රැවිස් සීඅයි ලේඛනගත කිරීම
ඔබට මෙම ලිපිය ඉංග්රීසි කතා කරන ප්රේක්ෂකයින් සමඟ බෙදා ගැනීමට අවශ්ය නම්, කරුණාකර පරිවර්තන සබැඳිය භාවිතා කරන්න: Maxim Zvyagintsev.
මූලාශ්රය: www.habr.com