9.9 KiB
9.9 KiB
Plugin Verification Scripts - Complete Implementation
Summary
Enhanced the plugin verification scripts to detect critical issues including:
- Component/UI Overlaps - CSS patterns that cause visual element overlap
- Early Function Calls - Functions called before they are defined
- Undefined Functions - Calls to functions that don't exist
- Undefined Arrays & Array Keys - Array accesses on potentially uninitialized variables
Changes Made
1. Enhanced check-duplicate-classes.php (PHP Static Analyzer)
New Features Added:
A. Undefined Function Detection
- Tracks all function calls in PHP files
- Compares against:
- Internal PHP functions (extensive list)
- WordPress/WooCommerce core functions
- User-defined functions in the codebase
- Reports undefined function calls with file and line number
- Example:
UNDEFINED FUNCTION: 'my_custom_func' called at admin/page.php:42
B. Early Function Call Detection
- Tracks function definitions with line numbers
- Detects when a function is called BEFORE it's defined in the same file
- Helps catch function ordering issues that can cause "Call to undefined function" errors
- Example:
EARLY FUNCTION CALL: 'process_data' called at line 15 but defined at line 85 in includes/helper.php
C. Potential Undefined Array Detection
- Tracks array access patterns:
$array['key']or$array[$key] - Tracks variable assignments for type inference
- Warns when arrays are accessed without clear initialization
- Suggests using
isset()or!empty()checks - Example:
POTENTIAL UNDEFINED ARRAY: '$options' accessed as array at functions.php:23
D. CSS Overlap Detection
- Scans all CSS files in the plugin
- Detects problematic CSS patterns:
- Negative margins (
margin-top: -15px- can pull elements into overlapping positions) - Absolute positioning without z-index (
position: absolutewithout proper z-index) - Fixed positioning at z-index 0 (
position: fixed; z-index: 0- overlaps other elements) - Elements anchored to both top/bottom or left/right
- Negative margins (
- Reports file, line number, and description of the issue
- Example:
POTENTIAL CSS OVERLAP in admin/css/admin.css:156
2. Enhanced validate-wordpress-plugin.sh (Bash Validator)
New Section 5.4: Runtime Error Detection
- Calls the enhanced
check-duplicate-classes.phpanalyzer - Parses and reports:
- Undefined functions (as ERROR - red)
- Early function calls (as ERROR - red)
- Potential undefined arrays (as WARNING - yellow)
- CSS overlaps (as WARNING - yellow)
- Displays first 5 instances of each issue type
New Section 9: CSS & UI Overlap Detection
- Separate CSS analysis section
- Checks for:
- Negative margins (common overlap cause)
- Absolute positioning without z-index
- Fixed positioning at z-index 0
- Shows first 5 instances and notes if more exist
- Reports as warnings (yellow)
Updated Section Numbering
- Changed from [1/8] to [1/10] to reflect new sections
- Updated all section headers to use consistent numbering
3. Updated README.md
Enhanced Documentation:
- Updated
check-duplicate-classes.phpdocumentation with:- All new detection capabilities
- CSS overlap detection patterns
- Example output showing all new features
- Updated options and exit codes
How It Works
Detection Logic
Undefined Functions
// Example code:
$result = some_undefined_function($data);
// Detection:
// 1. Parser tracks function calls: 'some_undefined_function' at line X
// 2. Checks if it's in internal PHP functions list: NO
// 3. Checks if it's in WP/WC functions list: NO
// 4. Checks if defined in codebase: NO
// 5. Reports: UNDEFINED FUNCTION at file:line X
Early Function Calls
// Example problematic code:
$result = my_function(); // Line 10
function my_function() { // Line 50
return "data";
}
// Detection:
// 1. Parser sees 'my_function' defined at line 50
// 2. Parser sees 'my_function' called at line 10
// 3. Reports: EARLY FUNCTION CALL - function called before definition
CSS Overlaps
/* Problematic CSS 1 - Negative Margin */
.button {
margin-left: -15px; /* Pulls element left into overlap */
}
/* Problematic CSS 2 - Absolute No Z-Index */
.modal {
position: absolute;
top: 50px;
/* Missing z-index - may overlap other absolute elements */
}
/* Problematic CSS 3 - Fixed at Z-Index 0 */
.header {
position: fixed;
z-index: 0; /* Overlaps page content at z-index 0 */
}
/* Detection for each case */
False Positive Handling
The implementation includes conservative checks to minimize false positives:
- Skips keywords (
if,while,for, etc.) in function detection - Checks both short names and fully-qualified names with namespaces
- Only reports clear cases (call at least 2 lines before definition)
- Limits CSS overlap reports to 5 instances per file
Usage Examples
Check a WordPress Plugin
# Run full validation with all checks
./scripts/validate-wordpress-plugin.sh /path/to/plugin
# Run just the PHP analyzer with verbose output
php scripts/check-duplicate-classes.php /path/to/plugin --verbose
# Run in strict mode (may have more false positives)
php scripts/check-duplicate-classes.php /path/to/plugin --strict
Example Output
========================================================
STRICT WORDPRESS PLUGIN SECURITY & CODE AUDIT
========================================================
Scanning: /path/to/plugin
[1/10] Checking for Dangerous/Forbidden Functions...
✓ No dangerous functions found
[2/10] Checking for SQL Injection Patterns...
✓ No SQL injection risks found
... (other checks)
[5.2/10] Checking for Duplicate Class/Function Declarations...
✓ No duplicate class declarations found
[5.4/10] Runtime Error Detection...
✗ UNDEFINED FUNCTIONS DETECTED
UNDEFINED FUNCTION: 'custom_helper_function' called at includes/helper.php:45
UNDEFINED FUNCTION: 'process_order_data' called at functions.php:112
✗ EARLY FUNCTION CALLS DETECTED
EARLY FUNCTION CALL: 'init_plugin' called at line 15 but defined at line 42 in plugin.php
⚠ POTENTIAL UNDEFINED ARRAYS
POTENTIAL UNDEFINED ARRAY: '$field_config' accessed as array at admin/class-admin.php:78
This array may not be initialized before use.
Consider using isset() or !empty() check before access.
⚠ POTENTIAL CSS OVERLAPS
POTENTIAL CSS OVERLAP in public/css/admin.css:156
Reason: Negative margin (may cause overlap)
Context: margin-left: -10px; position: relative;
[9/10] Checking CSS & UI for Overlap Issues...
⚠ CSS ISSUE in public/css/admin.css:156
Negative margins detected (may cause overlap)
margin-left: -10px; position: relative;
✓ No absolute positioning issues detected
✓ No fixed positioning issues detected
================================================================================
AUDIT RESULTS
================================================================================
FAIL: 2 Critical Security/Stability Issues Found.
(Plus 4 warnings requiring review)
Benefits
- Prevents Runtime Errors - Catches issues before deployment
- Improves UI Quality - Detects CSS overlap patterns that cause visual bugs
- Better Code Quality - Enforces proper function ordering and initialization
- Maintainability - Helps developers understand code dependencies
- Early Detection - Catches issues in CI/CD before they reach production
Limitations
The static analysis has some limitations:
- Cannot fully track scope (functions/methods in different contexts)
- May have false positives for dynamic function calls (
$func()) - CSS overlap detection is pattern-based (may miss complex overlap scenarios)
- Cannot verify external dependencies (functions from other plugins/libraries)
- Array key checks are conservative (suggests review rather than errors)
Best Practices for Developers
-
Define Functions Before Use
// Good function helper() { return 'data'; } echo helper(); // Bad echo helper(); // May fail if not autoloaded function helper() { return 'data'; } -
Initialize Arrays Before Access
// Good $options = []; $options['key'] = 'value'; // Or check first if (isset($options['key'])) { echo $options['key']; } // Bad echo $options['key']; // Undefined array -
Avoid CSS Overlaps
/* Good - use proper z-index */ .modal { position: absolute; z-index: 1000; top: 50%; left: 50%; transform: translate(-50%, -50%); } /* Good - use flex/grid instead of negative margins */ .container { display: flex; gap: 1rem; } /* Bad - negative margins cause overlap */ .sidebar { margin-left: -15px; }
CI/CD Integration
# Example GitHub Actions workflow
- name: Validate Plugin
run: |
./scripts/validate-wordpress-plugin.sh ./plugin-dir
continue-on-error: false
- name: Check for Runtime Issues
run: |
php scripts/check-duplicate-classes.php ./plugin-dir --verbose
Testing
To test the enhancements:
# Test on a real plugin
./scripts/validate-wordpress-plugin.sh /path/to/wordpress-plugin
# Test on a plugin with intentional issues
# Create a test plugin with:
# - Undefined function calls
# - Early function calls
# - Array access without initialization
# - CSS with negative margins
# Run validator and verify all issues are detected
Files Modified
/scripts/check-duplicate-classes.php- Enhanced with 4 new detection types/scripts/validate-wordpress-plugin.sh- Added 2 new sections (5.4 and 9)/scripts/README.md- Updated documentation with new features
Backward Compatibility
All changes are backward compatible:
- Existing checks remain unchanged
- New checks are additive only
- Exit codes maintain previous behavior
- Output format is consistent with existing style
- No breaking changes to script usage or parameters